--- /dev/null
- background-color: st-mix(#ffffff, #353535, 9%); }
+/* This stylesheet is generated, DO NOT EDIT */
+/* Copyright 2009, 2015 Red Hat, Inc.
+ *
+ * Portions adapted from Mx's data/style/default.css
+ * Copyright 2009 Intel Corporation
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU Lesser General Public License,
+ * version 2.1, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope it will be useful, but WITHOUT ANY
+ * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
+ */
+/* Global Values */
+stage {
+ font-size: 1em;
+ color: #ffffff; }
+
+/* Common Stylings */
+#dash .dash-item-container .show-apps,
+#dash .dash-item-container .overview-tile,
+#dash .dash-item-container .grid-search-result {
+ background: none;
+ box-shadow: none;
+ border: none;
+ border-radius: 0;
+ padding: 0;
+ margin: 0; }
+
+.app-folder-dialog .overview-tile, .app-folder-dialog .grid-search-result, .app-folder, .overview-tile, .grid-search-result, #dash .dash-item-container .show-apps .overview-icon,
+#dash .dash-item-container .overview-tile .overview-icon,
+#dash .dash-item-container .grid-search-result .overview-icon, .list-search-result, .search-provider-icon, .switcher-list .item-box, .audio-device-selection-dialog .audio-selection-box .audio-selection-device {
+ border-radius: 16px;
+ padding: 6px;
+ spacing: 6px;
+ text-align: center;
+ transition-duration: 100ms; }
+
+.login-dialog-user-list-view .login-dialog-user-list .login-dialog-user-list-item, .login-dialog-not-listed-button, .unlock-dialog .button,
+.unlock-dialog .icon-button,
+.unlock-dialog .message .message-header .message-expand-button,
+.message .message-header .unlock-dialog .message-expand-button,
+.unlock-dialog .message .message-header .message-close-button,
+.message .message-header .unlock-dialog .message-close-button,
+.unlock-dialog .screenshot-ui-show-pointer-button, #LookingGlassDialog .notebook-tab, .screenshot-ui-show-pointer-button, .screenshot-ui-type-button, #LookingGlassDebugFlags .lg-debug-flag-button, #LookingGlassPropertyInspector .lg-obj-inspector-close-button,
+#LookingGlassPropertyInspector .lg-obj-inspector-button, #LookingGlassDialog > #Toolbar .lg-toolbar-button, .icon-button, .login-dialog-button.cancel-button, .login-dialog-button.switch-user-button, .login-dialog-button.login-dialog-session-list-button, .message .message-header .message-expand-button,
+.message .message-header .message-close-button, .calendar .calendar-month-header .pager-button, .button {
+ border-radius: 8px;
+ padding: 3px 24px;
+ font-weight: bold;
+ transition: border-width 300ms cubic-bezier(0.25, 0.46, 0.45, 0.94), box-shadow 300ms cubic-bezier(0.25, 0.46, 0.45, 0.94); }
+
+.icon-button, .login-dialog-button.cancel-button, .login-dialog-button.switch-user-button, .login-dialog-button.login-dialog-session-list-button, .screenshot-ui-show-pointer-button, .message .message-header .message-expand-button,
+.message .message-header .message-close-button, .calendar .calendar-month-header .pager-button, .button {
+ color: #ffffff;
- box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.5) !important;
- background-color: st-mix(-st-accent-color, st-mix(#ffffff, #353535, 9%), 5%); }
++ background-color: st-mix(#ffffff, #36363a, 9%); }
+ .icon-button:focus, .login-dialog-button.cancel-button:focus, .login-dialog-button.switch-user-button:focus, .login-dialog-button.login-dialog-session-list-button:focus, .screenshot-ui-show-pointer-button:focus, .message .message-header .message-expand-button:focus,
+ .message .message-header .message-close-button:focus, .calendar .calendar-month-header .pager-button:focus, .button:focus {
+ color: #ffffff;
- background-color: st-mix(-st-accent-color, st-lighten(st-mix(#ffffff, #353535, 9%), 4%), 5%); }
++ box-shadow: inset 0 0 0 2px st-transparentize(st-mix(-st-accent-color, #ffffff, 60%), 0.2) !important;
++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(#ffffff, #36363a, 9%), 5%); }
+ .icon-button:focus:hover, .login-dialog-button.cancel-button:focus:hover, .login-dialog-button.switch-user-button:focus:hover, .login-dialog-button.login-dialog-session-list-button:focus:hover, .screenshot-ui-show-pointer-button:focus:hover, .message .message-header .message-expand-button:focus:hover,
+ .message .message-header .message-close-button:focus:hover, .calendar .calendar-month-header .pager-button:focus:hover, .button:focus:hover {
- background-color: st-lighten(st-mix(#ffffff, #353535, 9%), 4%); }
++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-lighten(st-mix(#ffffff, #36363a, 9%), 4%), 5%); }
+ .icon-button:hover, .login-dialog-button.cancel-button:hover, .login-dialog-button.switch-user-button:hover, .login-dialog-button.login-dialog-session-list-button:hover, .screenshot-ui-show-pointer-button:hover, .message .message-header .message-expand-button:hover,
+ .message .message-header .message-close-button:hover, .calendar .calendar-month-header .pager-button:hover, .button:hover {
+ color: #ffffff;
- background-color: st-darken(st-mix(#ffffff, #353535, 9%), 3%); }
++ background-color: st-lighten(st-mix(#ffffff, #36363a, 9%), 4%); }
+ .icon-button:insensitive, .login-dialog-button.cancel-button:insensitive, .login-dialog-button.switch-user-button:insensitive, .login-dialog-button.login-dialog-session-list-button:insensitive, .screenshot-ui-show-pointer-button:insensitive, .message .message-header .message-expand-button:insensitive,
+ .message .message-header .message-close-button:insensitive, .calendar .calendar-month-header .pager-button:insensitive, .button:insensitive {
+ color: st-transparentize(#ffffff, 0.5);
- background-color: st-lighten(st-mix(#ffffff, #353535, 9%), 9%); }
++ background-color: st-darken(st-mix(#ffffff, #36363a, 9%), 3%); }
+ .icon-button:selected, .login-dialog-button.cancel-button:selected, .login-dialog-button.switch-user-button:selected, .login-dialog-button.login-dialog-session-list-button:selected, .screenshot-ui-show-pointer-button:selected, .message .message-header .message-expand-button:selected,
+ .message .message-header .message-close-button:selected, .calendar .calendar-month-header .pager-button:selected, .button:selected, .icon-button:active, .login-dialog-button.cancel-button:active, .login-dialog-button.switch-user-button:active, .login-dialog-button.login-dialog-session-list-button:active, .screenshot-ui-show-pointer-button:active, .message .message-header .message-expand-button:active,
+ .message .message-header .message-close-button:active, .calendar .calendar-month-header .pager-button:active, .button:active {
+ color: #ffffff;
- background-color: st-lighten(st-lighten(st-mix(#ffffff, #353535, 9%), 9%), 4%); }
++ background-color: st-lighten(st-mix(#ffffff, #36363a, 9%), 9%); }
+ .icon-button:selected:hover, .login-dialog-button.cancel-button:selected:hover, .login-dialog-button.switch-user-button:selected:hover, .login-dialog-button.login-dialog-session-list-button:selected:hover, .screenshot-ui-show-pointer-button:selected:hover, .message .message-header .message-expand-button:selected:hover,
+ .message .message-header .message-close-button:selected:hover, .calendar .calendar-month-header .pager-button:selected:hover, .button:selected:hover, .icon-button:active:hover, .login-dialog-button.cancel-button:active:hover, .login-dialog-button.switch-user-button:active:hover, .login-dialog-button.login-dialog-session-list-button:active:hover, .screenshot-ui-show-pointer-button:active:hover, .message .message-header .message-expand-button:active:hover,
+ .message .message-header .message-close-button:active:hover, .calendar .calendar-month-header .pager-button:active:hover, .button:active:hover {
- background-color: st-mix(-st-accent-color, st-lighten(st-mix(#ffffff, #353535, 9%), 9%), 5%); }
++ background-color: st-lighten(st-lighten(st-mix(#ffffff, #36363a, 9%), 9%), 4%); }
+ .icon-button:selected:focus, .login-dialog-button.cancel-button:selected:focus, .login-dialog-button.switch-user-button:selected:focus, .login-dialog-button.login-dialog-session-list-button:selected:focus, .screenshot-ui-show-pointer-button:selected:focus, .message .message-header .message-expand-button:selected:focus,
+ .message .message-header .message-close-button:selected:focus, .calendar .calendar-month-header .pager-button:selected:focus, .button:selected:focus, .icon-button:active:focus, .login-dialog-button.cancel-button:active:focus, .login-dialog-button.switch-user-button:active:focus, .login-dialog-button.login-dialog-session-list-button:active:focus, .screenshot-ui-show-pointer-button:active:focus, .message .message-header .message-expand-button:active:focus,
+ .message .message-header .message-close-button:active:focus, .calendar .calendar-month-header .pager-button:active:focus, .button:active:focus {
- background-color: st-lighten(st-mix(#ffffff, #353535, 9%), 8%); }
++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-lighten(st-mix(#ffffff, #36363a, 9%), 9%), 5%); }
+ .icon-button:checked, .login-dialog-button.cancel-button:checked, .login-dialog-button.switch-user-button:checked, .login-dialog-button.login-dialog-session-list-button:checked, .screenshot-ui-show-pointer-button:checked, .message .message-header .message-expand-button:checked,
+ .message .message-header .message-close-button:checked, .calendar .calendar-month-header .pager-button:checked, .button:checked {
+ color: #ffffff;
- background-color: st-lighten(st-lighten(st-mix(#ffffff, #353535, 9%), 8%), 4%); }
++ background-color: st-lighten(st-mix(#ffffff, #36363a, 9%), 8%); }
+ .icon-button:checked:hover, .login-dialog-button.cancel-button:checked:hover, .login-dialog-button.switch-user-button:checked:hover, .login-dialog-button.login-dialog-session-list-button:checked:hover, .screenshot-ui-show-pointer-button:checked:hover, .message .message-header .message-expand-button:checked:hover,
+ .message .message-header .message-close-button:checked:hover, .calendar .calendar-month-header .pager-button:checked:hover, .button:checked:hover {
- background-color: st-lighten(st-lighten(st-mix(#ffffff, #353535, 9%), 8%), 9%); }
++ background-color: st-lighten(st-lighten(st-mix(#ffffff, #36363a, 9%), 8%), 4%); }
+ .icon-button:checked:active, .login-dialog-button.cancel-button:checked:active, .login-dialog-button.switch-user-button:checked:active, .login-dialog-button.login-dialog-session-list-button:checked:active, .screenshot-ui-show-pointer-button:checked:active, .message .message-header .message-expand-button:checked:active,
+ .message .message-header .message-close-button:checked:active, .calendar .calendar-month-header .pager-button:checked:active, .button:checked:active {
- background-color: #353535; }
++ background-color: st-lighten(st-lighten(st-mix(#ffffff, #36363a, 9%), 8%), 9%); }
+
+.calendar .calendar-day-heading, .calendar .calendar-day, .calendar .calendar-month-header .calendar-month-label, .icon-button.flat, .flat.login-dialog-button.cancel-button, .flat.login-dialog-button.switch-user-button, .flat.login-dialog-button.login-dialog-session-list-button, .flat.screenshot-ui-show-pointer-button, .message .message-header .flat.message-expand-button,
+.message .message-header .flat.message-close-button, .calendar .calendar-month-header .pager-button, .button.flat {
+ color: #ffffff;
- box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.5) !important;
- background-color: st-mix(-st-accent-color, rgba(53, 53, 53, 0.25), 5%); }
++ background-color: #36363a; }
+ .calendar .calendar-day-heading:focus, .calendar .calendar-day:focus, .calendar .calendar-month-header .calendar-month-label:focus, .icon-button.flat:focus, .flat.login-dialog-button.cancel-button:focus, .flat.login-dialog-button.switch-user-button:focus, .flat.login-dialog-button.login-dialog-session-list-button:focus, .flat.screenshot-ui-show-pointer-button:focus, .message .message-header .flat.message-expand-button:focus,
+ .message .message-header .flat.message-close-button:focus, .calendar .calendar-month-header .pager-button:focus, .button.flat:focus {
+ color: #ffffff;
- background-color: st-mix(-st-accent-color, st-lighten(#353535, 7%), 5%); }
++ box-shadow: inset 0 0 0 2px st-transparentize(st-mix(-st-accent-color, #ffffff, 60%), 0.2) !important;
++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), rgba(54, 54, 58, 0.25), 5%); }
+ .calendar .calendar-day-heading:focus:hover, .calendar .calendar-day:focus:hover, .calendar .calendar-month-header .calendar-month-label:focus:hover, .icon-button.flat:focus:hover, .flat.login-dialog-button.cancel-button:focus:hover, .flat.login-dialog-button.switch-user-button:focus:hover, .flat.login-dialog-button.login-dialog-session-list-button:focus:hover, .flat.screenshot-ui-show-pointer-button:focus:hover, .message .message-header .flat.message-expand-button:focus:hover,
+ .message .message-header .flat.message-close-button:focus:hover, .calendar .calendar-month-header .pager-button:focus:hover, .button.flat:focus:hover {
- background-color: st-lighten(#353535, 7%); }
++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-lighten(#36363a, 7%), 5%); }
+ .calendar .calendar-day-heading:hover, .calendar .calendar-day:hover, .calendar .calendar-month-header .calendar-month-label:hover, .icon-button.flat:hover, .flat.login-dialog-button.cancel-button:hover, .flat.login-dialog-button.switch-user-button:hover, .flat.login-dialog-button.login-dialog-session-list-button:hover, .flat.screenshot-ui-show-pointer-button:hover, .message .message-header .flat.message-expand-button:hover,
+ .message .message-header .flat.message-close-button:hover, .calendar .calendar-month-header .pager-button:hover, .button.flat:hover {
+ color: #ffffff;
- background-color: #353535; }
++ background-color: st-lighten(#36363a, 7%); }
+ .calendar .calendar-day-heading:insensitive, .calendar .calendar-day:insensitive, .calendar .calendar-month-header .calendar-month-label:insensitive, .icon-button.flat:insensitive, .flat.login-dialog-button.cancel-button:insensitive, .flat.login-dialog-button.switch-user-button:insensitive, .flat.login-dialog-button.login-dialog-session-list-button:insensitive, .flat.screenshot-ui-show-pointer-button:insensitive, .message .message-header .flat.message-expand-button:insensitive,
+ .message .message-header .flat.message-close-button:insensitive, .calendar .calendar-month-header .pager-button:insensitive, .button.flat:insensitive {
+ color: st-transparentize(#ffffff, 0.5);
- background-color: st-lighten(#353535, 9%); }
++ background-color: #36363a; }
+ .calendar .calendar-day-heading:selected, .calendar .calendar-day:selected, .calendar .calendar-month-header .calendar-month-label:selected, .icon-button.flat:selected, .flat.login-dialog-button.cancel-button:selected, .flat.login-dialog-button.switch-user-button:selected, .flat.login-dialog-button.login-dialog-session-list-button:selected, .flat.screenshot-ui-show-pointer-button:selected, .message .message-header .flat.message-expand-button:selected,
+ .message .message-header .flat.message-close-button:selected, .calendar .calendar-month-header .pager-button:selected, .button.flat:selected, .calendar .calendar-day-heading:active, .calendar .calendar-day:active, .calendar .calendar-month-header .calendar-month-label:active, .icon-button.flat:active, .flat.login-dialog-button.cancel-button:active, .flat.login-dialog-button.switch-user-button:active, .flat.login-dialog-button.login-dialog-session-list-button:active, .flat.screenshot-ui-show-pointer-button:active, .message .message-header .flat.message-expand-button:active,
+ .message .message-header .flat.message-close-button:active, .calendar .calendar-month-header .pager-button:active, .button.flat:active {
+ color: #ffffff;
- background-color: st-lighten(st-lighten(#353535, 9%), 7%); }
++ background-color: st-lighten(#36363a, 9%); }
+ .calendar .calendar-day-heading:selected:hover, .calendar .calendar-day:selected:hover, .calendar .calendar-month-header .calendar-month-label:selected:hover, .icon-button.flat:selected:hover, .flat.login-dialog-button.cancel-button:selected:hover, .flat.login-dialog-button.switch-user-button:selected:hover, .flat.login-dialog-button.login-dialog-session-list-button:selected:hover, .flat.screenshot-ui-show-pointer-button:selected:hover, .message .message-header .flat.message-expand-button:selected:hover,
+ .message .message-header .flat.message-close-button:selected:hover, .calendar .calendar-month-header .pager-button:selected:hover, .button.flat:selected:hover, .calendar .calendar-day-heading:active:hover, .calendar .calendar-day:active:hover, .calendar .calendar-month-header .calendar-month-label:active:hover, .icon-button.flat:active:hover, .flat.login-dialog-button.cancel-button:active:hover, .flat.login-dialog-button.switch-user-button:active:hover, .flat.login-dialog-button.login-dialog-session-list-button:active:hover, .flat.screenshot-ui-show-pointer-button:active:hover, .message .message-header .flat.message-expand-button:active:hover,
+ .message .message-header .flat.message-close-button:active:hover, .calendar .calendar-month-header .pager-button:active:hover, .button.flat:active:hover {
- background-color: st-mix(-st-accent-color, st-lighten(#353535, 9%), 5%); }
++ background-color: st-lighten(st-lighten(#36363a, 9%), 7%); }
+ .calendar .calendar-day-heading:selected:focus, .calendar .calendar-day:selected:focus, .calendar .calendar-month-header .calendar-month-label:selected:focus, .icon-button.flat:selected:focus, .flat.login-dialog-button.cancel-button:selected:focus, .flat.login-dialog-button.switch-user-button:selected:focus, .flat.login-dialog-button.login-dialog-session-list-button:selected:focus, .flat.screenshot-ui-show-pointer-button:selected:focus, .message .message-header .flat.message-expand-button:selected:focus,
+ .message .message-header .flat.message-close-button:selected:focus, .calendar .calendar-month-header .pager-button:selected:focus, .button.flat:selected:focus, .calendar .calendar-day-heading:active:focus, .calendar .calendar-day:active:focus, .calendar .calendar-month-header .calendar-month-label:active:focus, .icon-button.flat:active:focus, .flat.login-dialog-button.cancel-button:active:focus, .flat.login-dialog-button.switch-user-button:active:focus, .flat.login-dialog-button.login-dialog-session-list-button:active:focus, .flat.screenshot-ui-show-pointer-button:active:focus, .message .message-header .flat.message-expand-button:active:focus,
+ .message .message-header .flat.message-close-button:active:focus, .calendar .calendar-month-header .pager-button:active:focus, .button.flat:active:focus {
- background-color: st-lighten(#353535, 8%); }
++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-lighten(#36363a, 9%), 5%); }
+ .calendar .calendar-day-heading:checked, .calendar .calendar-day:checked, .calendar .calendar-month-header .calendar-month-label:checked, .icon-button.flat:checked, .flat.login-dialog-button.cancel-button:checked, .flat.login-dialog-button.switch-user-button:checked, .flat.login-dialog-button.login-dialog-session-list-button:checked, .flat.screenshot-ui-show-pointer-button:checked, .message .message-header .flat.message-expand-button:checked,
+ .message .message-header .flat.message-close-button:checked, .calendar .calendar-month-header .pager-button:checked, .button.flat:checked {
+ color: #ffffff;
- background-color: st-lighten(st-lighten(#353535, 8%), 7%); }
++ background-color: st-lighten(#36363a, 8%); }
+ .calendar .calendar-day-heading:checked:hover, .calendar .calendar-day:checked:hover, .calendar .calendar-month-header .calendar-month-label:checked:hover, .icon-button.flat:checked:hover, .flat.login-dialog-button.cancel-button:checked:hover, .flat.login-dialog-button.switch-user-button:checked:hover, .flat.login-dialog-button.login-dialog-session-list-button:checked:hover, .flat.screenshot-ui-show-pointer-button:checked:hover, .message .message-header .flat.message-expand-button:checked:hover,
+ .message .message-header .flat.message-close-button:checked:hover, .calendar .calendar-month-header .pager-button:checked:hover, .button.flat:checked:hover {
- background-color: st-lighten(st-lighten(#353535, 8%), 9%); }
++ background-color: st-lighten(st-lighten(#36363a, 8%), 7%); }
+ .calendar .calendar-day-heading:checked:active, .calendar .calendar-day:checked:active, .calendar .calendar-month-header .calendar-month-label:checked:active, .icon-button.flat:checked:active, .flat.login-dialog-button.cancel-button:checked:active, .flat.login-dialog-button.switch-user-button:checked:active, .flat.login-dialog-button.login-dialog-session-list-button:checked:active, .flat.screenshot-ui-show-pointer-button:checked:active, .message .message-header .flat.message-expand-button:checked:active,
+ .message .message-header .flat.message-close-button:checked:active, .calendar .calendar-month-header .pager-button:checked:active, .button.flat:checked:active {
- .keyboard-brightness-level .button:checked, .quick-menu-toggle .quick-toggle-arrow:checked, .quick-toggle:checked, .calendar .calendar-day.calendar-today, .icon-button.default, .default.login-dialog-button.cancel-button, .default.login-dialog-button.switch-user-button, .default.login-dialog-button.login-dialog-session-list-button, .default.screenshot-ui-show-pointer-button, .message .message-header .default.message-expand-button,
++ background-color: st-lighten(st-lighten(#36363a, 8%), 9%); }
+
- .keyboard-brightness-level .button:focus:checked, .quick-menu-toggle .quick-toggle-arrow:focus:checked, .quick-toggle:focus:checked, .calendar .calendar-day.calendar-today:focus, .icon-button.default:focus, .default.login-dialog-button.cancel-button:focus, .default.login-dialog-button.switch-user-button:focus, .default.login-dialog-button.login-dialog-session-list-button:focus, .default.screenshot-ui-show-pointer-button:focus, .message .message-header .default.message-expand-button:focus,
++.keyboard-brightness-level .button:checked, .quick-toggle:checked, .calendar .calendar-day.calendar-today, .icon-button.default, .default.login-dialog-button.cancel-button, .default.login-dialog-button.switch-user-button, .default.login-dialog-button.login-dialog-session-list-button, .default.screenshot-ui-show-pointer-button, .message .message-header .default.message-expand-button,
+.message .message-header .default.message-close-button, .calendar .calendar-month-header .default.pager-button, .button.default {
+ color: -st-accent-fg-color;
+ background-color: -st-accent-color; }
- box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.5) !important;
- box-shadow: inset 0 0 0 2px st-lighten(-st-accent-color, 15%) !important;
- background-color: st-mix(-st-accent-color, -st-accent-color, 5%); }
- .keyboard-brightness-level .button:focus:hover:checked, .quick-menu-toggle .quick-toggle-arrow:focus:hover:checked, .quick-toggle:focus:hover:checked, .calendar .calendar-day.calendar-today:focus:hover, .icon-button.default:focus:hover, .default.login-dialog-button.cancel-button:focus:hover, .default.login-dialog-button.switch-user-button:focus:hover, .default.login-dialog-button.login-dialog-session-list-button:focus:hover, .default.screenshot-ui-show-pointer-button:focus:hover, .message .message-header .default.message-expand-button:focus:hover,
++ .keyboard-brightness-level .button:focus:checked, .quick-toggle:focus:checked, .calendar .calendar-day.calendar-today:focus, .icon-button.default:focus, .default.login-dialog-button.cancel-button:focus, .default.login-dialog-button.switch-user-button:focus, .default.login-dialog-button.login-dialog-session-list-button:focus, .default.screenshot-ui-show-pointer-button:focus, .message .message-header .default.message-expand-button:focus,
+ .message .message-header .default.message-close-button:focus, .calendar .calendar-month-header .default.pager-button:focus, .button.default:focus {
+ color: -st-accent-fg-color;
- background-color: st-mix(-st-accent-color, st-lighten(-st-accent-color, 4%), 5%); }
- .keyboard-brightness-level .button:hover:checked, .quick-menu-toggle .quick-toggle-arrow:hover:checked, .quick-toggle:hover:checked, .calendar .calendar-day.calendar-today:hover, .icon-button.default:hover, .default.login-dialog-button.cancel-button:hover, .default.login-dialog-button.switch-user-button:hover, .default.login-dialog-button.login-dialog-session-list-button:hover, .default.screenshot-ui-show-pointer-button:hover, .message .message-header .default.message-expand-button:hover,
++ box-shadow: inset 0 0 0 2px st-transparentize(st-mix(-st-accent-color, #ffffff, 60%), 0.2) !important;
++ box-shadow: inset 0 0 0 2px st-transparentize(st-lighten(-st-accent-color, 30%), 0.2) !important;
++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), -st-accent-color, 5%); }
++ .keyboard-brightness-level .button:focus:hover:checked, .quick-toggle:focus:hover:checked, .calendar .calendar-day.calendar-today:focus:hover, .icon-button.default:focus:hover, .default.login-dialog-button.cancel-button:focus:hover, .default.login-dialog-button.switch-user-button:focus:hover, .default.login-dialog-button.login-dialog-session-list-button:focus:hover, .default.screenshot-ui-show-pointer-button:focus:hover, .message .message-header .default.message-expand-button:focus:hover,
+ .message .message-header .default.message-close-button:focus:hover, .calendar .calendar-month-header .default.pager-button:focus:hover, .button.default:focus:hover {
- .keyboard-brightness-level .button:insensitive:checked, .quick-menu-toggle .quick-toggle-arrow:insensitive:checked, .quick-toggle:insensitive:checked, .calendar .calendar-day.calendar-today:insensitive, .icon-button.default:insensitive, .default.login-dialog-button.cancel-button:insensitive, .default.login-dialog-button.switch-user-button:insensitive, .default.login-dialog-button.login-dialog-session-list-button:insensitive, .default.screenshot-ui-show-pointer-button:insensitive, .message .message-header .default.message-expand-button:insensitive,
++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-lighten(-st-accent-color, 4%), 5%); }
++ .keyboard-brightness-level .button:hover:checked, .quick-toggle:hover:checked, .calendar .calendar-day.calendar-today:hover, .icon-button.default:hover, .default.login-dialog-button.cancel-button:hover, .default.login-dialog-button.switch-user-button:hover, .default.login-dialog-button.login-dialog-session-list-button:hover, .default.screenshot-ui-show-pointer-button:hover, .message .message-header .default.message-expand-button:hover,
+ .message .message-header .default.message-close-button:hover, .calendar .calendar-month-header .default.pager-button:hover, .button.default:hover {
+ color: -st-accent-fg-color;
+ background-color: st-lighten(-st-accent-color, 4%); }
- .keyboard-brightness-level .button:active:checked, .quick-menu-toggle .quick-toggle-arrow:active:checked, .quick-toggle:active:checked, .calendar .calendar-day.calendar-today:active, .icon-button.default:active, .default.login-dialog-button.cancel-button:active, .default.login-dialog-button.switch-user-button:active, .default.login-dialog-button.login-dialog-session-list-button:active, .default.screenshot-ui-show-pointer-button:active, .message .message-header .default.message-expand-button:active,
++ .keyboard-brightness-level .button:insensitive:checked, .quick-toggle:insensitive:checked, .calendar .calendar-day.calendar-today:insensitive, .icon-button.default:insensitive, .default.login-dialog-button.cancel-button:insensitive, .default.login-dialog-button.switch-user-button:insensitive, .default.login-dialog-button.login-dialog-session-list-button:insensitive, .default.screenshot-ui-show-pointer-button:insensitive, .message .message-header .default.message-expand-button:insensitive,
+ .message .message-header .default.message-close-button:insensitive, .calendar .calendar-month-header .default.pager-button:insensitive, .button.default:insensitive {
+ color: st-transparentize(-st-accent-fg-color, 0.5);
+ background-color: st-darken(-st-accent-color, 3%); }
- .keyboard-brightness-level .button:active:hover:checked, .quick-menu-toggle .quick-toggle-arrow:active:hover:checked, .quick-toggle:active:hover:checked, .calendar .calendar-day.calendar-today:active:hover, .icon-button.default:active:hover, .default.login-dialog-button.cancel-button:active:hover, .default.login-dialog-button.switch-user-button:active:hover, .default.login-dialog-button.login-dialog-session-list-button:active:hover, .default.screenshot-ui-show-pointer-button:active:hover, .message .message-header .default.message-expand-button:active:hover,
++ .keyboard-brightness-level .button:active:checked, .quick-toggle:active:checked, .calendar .calendar-day.calendar-today:active, .icon-button.default:active, .default.login-dialog-button.cancel-button:active, .default.login-dialog-button.switch-user-button:active, .default.login-dialog-button.login-dialog-session-list-button:active, .default.screenshot-ui-show-pointer-button:active, .message .message-header .default.message-expand-button:active,
+ .message .message-header .default.message-close-button:active, .calendar .calendar-month-header .default.pager-button:active, .button.default:active {
+ color: -st-accent-fg-color;
+ background-color: st-lighten(-st-accent-color, 9%); }
- .keyboard-brightness-level .button:active:focus:checked, .quick-menu-toggle .quick-toggle-arrow:active:focus:checked, .quick-toggle:active:focus:checked, .calendar .calendar-day.calendar-today:active:focus, .icon-button.default:active:focus, .default.login-dialog-button.cancel-button:active:focus, .default.login-dialog-button.switch-user-button:active:focus, .default.login-dialog-button.login-dialog-session-list-button:active:focus, .default.screenshot-ui-show-pointer-button:active:focus, .message .message-header .default.message-expand-button:active:focus,
++ .keyboard-brightness-level .button:active:hover:checked, .quick-toggle:active:hover:checked, .calendar .calendar-day.calendar-today:active:hover, .icon-button.default:active:hover, .default.login-dialog-button.cancel-button:active:hover, .default.login-dialog-button.switch-user-button:active:hover, .default.login-dialog-button.login-dialog-session-list-button:active:hover, .default.screenshot-ui-show-pointer-button:active:hover, .message .message-header .default.message-expand-button:active:hover,
+ .message .message-header .default.message-close-button:active:hover, .calendar .calendar-month-header .default.pager-button:active:hover, .button.default:active:hover {
+ background-color: st-lighten(st-lighten(-st-accent-color, 9%), 4%); }
- background-color: st-mix(-st-accent-color, st-lighten(-st-accent-color, 9%), 5%); }
++ .keyboard-brightness-level .button:active:focus:checked, .quick-toggle:active:focus:checked, .calendar .calendar-day.calendar-today:active:focus, .icon-button.default:active:focus, .default.login-dialog-button.cancel-button:active:focus, .default.login-dialog-button.switch-user-button:active:focus, .default.login-dialog-button.login-dialog-session-list-button:active:focus, .default.screenshot-ui-show-pointer-button:active:focus, .message .message-header .default.message-expand-button:active:focus,
+ .message .message-header .default.message-close-button:active:focus, .calendar .calendar-month-header .default.pager-button:active:focus, .button.default:active:focus {
- background-color: #474747;
++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-lighten(-st-accent-color, 9%), 5%); }
+
+.popup-sub-menu .popup-menu-item, .popup-menu-item {
+ font-weight: normal;
+ spacing: 6px;
+ transition-duration: 100ms;
+ padding: 9px 12px; }
+
+#LookingGlassExtensions .lg-extension, #LookingGlassWindows .lg-window, .calendar, .datemenu-today-button, .quick-toggle-menu, .message, .events-button,
+.world-clocks-button,
+.weather-button {
+ border-radius: 12px;
+ padding: 0.818em;
+ margin: 4px;
- background-color: #474747; }
++ background-color: #47474c;
+ box-shadow: 0 1px 2px 0 transparent;
+ border: 1px solid transparent; }
+
+.quick-toggle-menu, .message, .events-button,
+.world-clocks-button,
+.weather-button {
+ color: #ffffff;
- background-color: st-lighten(#474747, 4%); }
++ background-color: #47474c; }
+ .quick-toggle-menu:hover, .message:hover, .events-button:hover,
+ .world-clocks-button:hover,
+ .weather-button:hover {
+ color: #ffffff;
- background-color: st-lighten(#474747, 9%); }
++ background-color: st-lighten(#47474c, 4%); }
+ .quick-toggle-menu:active, .message:active, .events-button:active,
+ .world-clocks-button:active,
+ .weather-button:active {
+ color: #ffffff;
- background-color: st-lighten(st-lighten(#474747, 9%), 4%); }
++ background-color: st-lighten(#47474c, 9%); }
+ .quick-toggle-menu:active:hover, .message:active:hover, .events-button:active:hover,
+ .world-clocks-button:active:hover,
+ .weather-button:active:hover {
- background-color: st-mix(-st-accent-color, st-lighten(#474747, 9%), 5%); }
++ background-color: st-lighten(st-lighten(#47474c, 9%), 4%); }
+ .quick-toggle-menu:active:focus, .message:active:focus, .events-button:active:focus,
+ .world-clocks-button:active:focus,
+ .weather-button:active:focus {
- box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.5) !important;
- background-color: st-mix(-st-accent-color, #474747, 5%); }
++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-lighten(#47474c, 9%), 5%); }
+ .quick-toggle-menu:focus, .message:focus, .events-button:focus,
+ .world-clocks-button:focus,
+ .weather-button:focus {
+ color: #ffffff;
- background-color: st-mix(-st-accent-color, st-lighten(#474747, 4%), 5%); }
++ box-shadow: inset 0 0 0 2px st-transparentize(st-mix(-st-accent-color, #ffffff, 60%), 0.2) !important;
++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), #47474c, 5%); }
+ .quick-toggle-menu:focus:hover, .message:focus:hover, .events-button:focus:hover,
+ .world-clocks-button:focus:hover,
+ .weather-button:focus:hover {
- background-color: st-darken(#474747, 3%); }
++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-lighten(#47474c, 4%), 5%); }
+ .quick-toggle-menu:insensitive, .message:insensitive, .events-button:insensitive,
+ .world-clocks-button:insensitive,
+ .weather-button:insensitive {
+ color: st-transparentize(#ffffff, 0.5);
- background-color: st-lighten(#353535, 7%); }
++ background-color: st-darken(#47474c, 3%); }
+
+.calendar, .datemenu-today-button {
+ border: 1px solid transparent !important;
+ background-color: transparent;
+ border-color: transparent;
+ box-shadow: none; }
+ .calendar:insensitive, .datemenu-today-button:insensitive {
+ background-color: transparent !important; }
+ .calendar:hover, .datemenu-today-button:hover {
+ color: #ffffff;
- background-color: st-lighten(#353535, 9%); }
++ background-color: st-lighten(#36363a, 7%); }
+ .calendar:active, .datemenu-today-button:active {
+ color: #ffffff;
- background-color: st-lighten(st-lighten(#353535, 9%), 7%); }
++ background-color: st-lighten(#36363a, 9%); }
+ .calendar:active:hover, .datemenu-today-button:active:hover {
- background-color: st-mix(-st-accent-color, st-lighten(#353535, 9%), 5%); }
++ background-color: st-lighten(st-lighten(#36363a, 9%), 7%); }
+ .calendar:active:focus, .datemenu-today-button:active:focus {
- box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.5) !important;
- background-color: st-mix(-st-accent-color, #474747, 5%); }
++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-lighten(#36363a, 9%), 5%); }
+ .calendar:focus, .datemenu-today-button:focus {
+ color: #ffffff;
- background-color: st-mix(-st-accent-color, st-lighten(#474747, 4%), 5%); }
++ box-shadow: inset 0 0 0 2px st-transparentize(st-mix(-st-accent-color, #ffffff, 60%), 0.2) !important;
++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), #47474c, 5%); }
+ .calendar:focus:hover, .datemenu-today-button:focus:hover {
- background-color: st-darken(#474747, 3%); }
++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-lighten(#47474c, 4%), 5%); }
+ .calendar:insensitive, .datemenu-today-button:insensitive {
+ color: st-transparentize(#ffffff, 0.5);
- background-color: #474747;
++ background-color: st-darken(#47474c, 3%); }
+
+.unlock-dialog .login-dialog-prompt-entry, .login-dialog .login-dialog-prompt-entry, .app-folder-dialog .folder-name-container .folder-name-entry, .search-entry, .lg-dialog StEntry, StEntry {
+ border-radius: 8px;
+ padding: 9px 9px;
+ selection-background-color: st-transparentize(-st-accent-color, 0.7);
+ selected-color: #ffffff; }
+
+StEntry {
- background-color: #515151;
++ background-color: #48484c;
+ color: rgba(255, 255, 255, 0.7); }
+ StEntry:hover {
- box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.5) !important;
- background-color: st-mix(-st-accent-color, #474747, 5%);
++ background-color: #525256;
+ color: #ffffff; }
+ StEntry:focus {
- background-color: #3f3f3f;
++ box-shadow: inset 0 0 0 2px st-transparentize(st-mix(-st-accent-color, #ffffff, 60%), 0.2) !important;
++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), #48484c, 5%);
+ color: #ffffff; }
+ StEntry:insensitive {
- box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.5) !important;
- background-color: st-mix(-st-accent-color, rgba(255, 255, 255, 0.15), 5%); }
++ background-color: #414144;
+ color: rgba(255, 255, 255, 0.5); }
+ StEntry StLabel.hint-text {
+ color: rgba(255, 255, 255, 0.7); }
+
+.notification-button, .message .message-header .message-expand-button,
+.message .message-header .message-close-button {
+ font-weight: bold;
+ padding: 6px 12px;
+ border-radius: 8px;
+ color: #ffffff;
+ background-color: rgba(255, 255, 255, 0.15); }
+ .notification-button:focus, .message .message-header .message-expand-button:focus,
+ .message .message-header .message-close-button:focus {
+ color: #ffffff;
- background-color: st-mix(-st-accent-color, rgba(255, 255, 255, 0.3), 5%); }
++ box-shadow: inset 0 0 0 2px st-transparentize(st-mix(-st-accent-color, #ffffff, 60%), 0.2) !important;
++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), rgba(255, 255, 255, 0.15), 5%); }
+ .notification-button:focus:hover, .message .message-header .message-expand-button:focus:hover,
+ .message .message-header .message-close-button:focus:hover {
- background-color: st-mix(-st-accent-color, rgba(255, 255, 255, 0.2), 5%); }
++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), rgba(255, 255, 255, 0.3), 5%); }
+ .notification-button:hover, .message .message-header .message-expand-button:hover,
+ .message .message-header .message-close-button:hover {
+ color: #ffffff;
+ background-color: rgba(255, 255, 255, 0.3); }
+ .notification-button:active, .message .message-header .message-expand-button:active,
+ .message .message-header .message-close-button:active {
+ color: #ffffff;
+ background-color: rgba(255, 255, 255, 0.2); }
+ .notification-button:active:hover, .message .message-header .message-expand-button:active:hover,
+ .message .message-header .message-close-button:active:hover {
+ background-color: rgba(255, 255, 255, 0.2); }
+ .notification-button:active:focus, .message .message-header .message-expand-button:active:focus,
+ .message .message-header .message-close-button:active:focus {
- background-color: st-lighten(st-mix(#ffffff, #353535, 9%), 8%); }
++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), rgba(255, 255, 255, 0.2), 5%); }
+ .notification-button:checked, .message .message-header .message-expand-button:checked,
+ .message .message-header .message-close-button:checked {
+ color: #ffffff;
- background-color: st-lighten(st-lighten(st-mix(#ffffff, #353535, 9%), 8%), 4%); }
++ background-color: st-lighten(st-mix(#ffffff, #36363a, 9%), 8%); }
+ .notification-button:checked:hover, .message .message-header .message-expand-button:checked:hover,
+ .message .message-header .message-close-button:checked:hover {
- background-color: st-lighten(st-lighten(st-mix(#ffffff, #353535, 9%), 8%), 9%); }
++ background-color: st-lighten(st-lighten(st-mix(#ffffff, #36363a, 9%), 8%), 4%); }
+ .notification-button:checked:active, .message .message-header .message-expand-button:checked:active,
+ .message .message-header .message-close-button:checked:active {
- box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.5) !important;
- background-color: st-mix(-st-accent-color, rgba(255, 255, 255, 0.1), 5%); }
++ background-color: st-lighten(st-lighten(st-mix(#ffffff, #36363a, 9%), 8%), 9%); }
+ .notification-button:insensitive, .message .message-header .message-expand-button:insensitive,
+ .message .message-header .message-close-button:insensitive {
+ color: st-transparentize(#ffffff, 0.5);
+ background-color: rgba(255, 255, 255, 0.1); }
+
+.modal-dialog .modal-dialog-button-box .modal-dialog-button {
+ font-weight: bold;
+ padding: 12px;
+ border-radius: 12px;
+ color: #ffffff;
+ background-color: rgba(255, 255, 255, 0.1); }
+ .modal-dialog .modal-dialog-button-box .modal-dialog-button:focus {
+ color: #ffffff;
- background-color: st-mix(-st-accent-color, rgba(255, 255, 255, 0.13), 5%); }
++ box-shadow: inset 0 0 0 2px st-transparentize(st-mix(-st-accent-color, #ffffff, 60%), 0.2) !important;
++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), rgba(255, 255, 255, 0.1), 5%); }
+ .modal-dialog .modal-dialog-button-box .modal-dialog-button:focus:hover {
- background-color: st-mix(-st-accent-color, rgba(255, 255, 255, 0.16), 5%); }
++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), rgba(255, 255, 255, 0.13), 5%); }
+ .modal-dialog .modal-dialog-button-box .modal-dialog-button:hover {
+ color: #ffffff;
+ background-color: rgba(255, 255, 255, 0.13); }
+ .modal-dialog .modal-dialog-button-box .modal-dialog-button:active {
+ color: #ffffff;
+ background-color: rgba(255, 255, 255, 0.16); }
+ .modal-dialog .modal-dialog-button-box .modal-dialog-button:active:hover {
+ background-color: rgba(255, 255, 255, 0.19); }
+ .modal-dialog .modal-dialog-button-box .modal-dialog-button:active:focus {
- background-color: st-lighten(st-mix(#ffffff, #353535, 9%), 8%); }
++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), rgba(255, 255, 255, 0.16), 5%); }
+ .modal-dialog .modal-dialog-button-box .modal-dialog-button:checked {
+ color: #ffffff;
- background-color: st-lighten(st-lighten(st-mix(#ffffff, #353535, 9%), 8%), 4%); }
++ background-color: st-lighten(st-mix(#ffffff, #36363a, 9%), 8%); }
+ .modal-dialog .modal-dialog-button-box .modal-dialog-button:checked:hover {
- background-color: st-lighten(st-lighten(st-mix(#ffffff, #353535, 9%), 8%), 9%); }
++ background-color: st-lighten(st-lighten(st-mix(#ffffff, #36363a, 9%), 8%), 4%); }
+ .modal-dialog .modal-dialog-button-box .modal-dialog-button:checked:active {
- background-color: st-darken(st-mix(#ffffff, #353535, 9%), 3%); }
++ background-color: st-lighten(st-lighten(st-mix(#ffffff, #36363a, 9%), 8%), 9%); }
+ .modal-dialog .modal-dialog-button-box .modal-dialog-button:insensitive {
+ color: st-transparentize(#ffffff, 0.5);
- .conflicting-session-dialog-content .conflicting-session-dialog-title, .message-dialog-content .message-dialog-title, .message-list .message-list-placeholder, .datemenu-today-button .date-label {
++ background-color: st-darken(st-mix(#ffffff, #36363a, 9%), 3%); }
+
+.dash-label, .window-caption, .screenshot-ui-tooltip {
+ background-color: rgba(0, 0, 0, 0.9);
+ border: 1px solid rgba(255, 255, 255, 0.1);
+ color: #ffffff;
+ border-radius: 999px;
+ padding: 6px 12px;
+ text-align: center; }
+
+/* General Typography */
+.unlock-dialog-clock .unlock-dialog-clock-date, .app-folder-dialog .folder-name-container .folder-name-label, .app-folder-dialog .folder-name-container .folder-name-entry, .search-statustext {
+ font-weight: 800;
+ font-size: 1.818em; }
+
- .unlock-dialog .user-widget.horizontal .user-widget-label, .quick-toggle-menu .header .title {
++.conflicting-session-dialog-content .conflicting-session-dialog-title, .message-dialog-content .message-dialog-title, .datemenu-today-button .date-label {
+ font-weight: 800;
+ font-size: 1.364em; }
+
+.login-dialog .user-widget.horizontal .user-widget-label,
- .login-dialog-not-listed-label, #LookingGlassExtensions .lg-extension .lg-extension-name, #LookingGlassWindows .lg-window .lg-window-name, #LookingGlassPropertyInspector .lg-obj-inspector-title, .background-app-item .title, .osd-window, .dialog-list .dialog-list-title, .message-list-controls, .weather-button .weather-box .weather-header-box .weather-header, .world-clocks-button .world-clocks-header, .events-button .events-box .events-list .event-box .event-summary, .events-button .events-box .events-title, .calendar .calendar-month-header .calendar-month-label {
++.unlock-dialog .user-widget.horizontal .user-widget-label, .quick-toggle-menu .header .title, .message-list .message-list-placeholder {
+ font-weight: 700;
+ font-size: 1.364em; }
+
+.login-dialog-auth-list-label, #LookingGlassDebugFlags .lg-debug-flags-header, #LookingGlassExtensions .lg-extensions-none, .word-suggestions, .bt-menu-placeholder.popup-menu-item, .restart-message, .polkit-dialog-user-layout .polkit-dialog-user-label,
+.polkit-dialog-user-layout .polkit-dialog-user-root-label, .message-dialog-content .message-dialog-title.lightweight {
+ font-weight: 700;
+ font-size: 1.182em; }
+
- .lg-completions-text, .caps-lock-warning-label, .background-app-item .subtitle, .quick-toggle StBoxLayout > .quick-toggle-subtitle, .screenshot-ui-type-button .icon-label-button-container, .prompt-dialog .prompt-dialog-error-label,
++.login-dialog-not-listed-label, #LookingGlassExtensions .lg-extension .lg-extension-name, #LookingGlassWindows .lg-window .lg-window-name, #LookingGlassPropertyInspector .lg-obj-inspector-title, .background-app-item .title, .quick-toggle .quick-toggle-title, .osd-window, .dialog-list .dialog-list-title, .message-list-controls, .weather-button .weather-box .weather-header-box .weather-header, .world-clocks-button .world-clocks-header, .events-button .events-box .events-list .event-box .event-summary, .events-button .events-box .events-title, .calendar .calendar-month-header .calendar-month-label {
+ font-weight: 700;
+ font-size: 1em; }
+
+.quick-toggle-menu .header .subtitle, .app-menu .popup-inactive-menu-item:first-child > StLabel {
+ font-weight: 700;
+ font-size: 0.818em; }
+
- background-color: #353535;
++.lg-completions-text, .caps-lock-warning-label, .background-app-item .subtitle, .quick-toggle .quick-toggle-subtitle, .screenshot-ui-type-button .icon-label-button-container, .prompt-dialog .prompt-dialog-error-label,
+.prompt-dialog .prompt-dialog-info-label,
+.prompt-dialog .prompt-dialog-null-label, .run-dialog .run-dialog-description, .dialog-list .dialog-list-box .dialog-list-item .dialog-list-item-description, .message .message-header .message-header-content .event-time, .world-clocks-button .world-clocks-grid .world-clocks-timezone, .events-button .events-box .events-list .event-box .event-time {
+ font-weight: 400;
+ font-size: 0.818em; }
+
+.weather-button .weather-box .weather-grid .weather-forecast-time, .calendar .calendar-week-number, .calendar .calendar-day-heading, .calendar .calendar-day {
+ font-weight: 400;
+ font-size: 0.818em; }
+
+#LookingGlassDebugFlags .lg-debug-flag-button StLabel, #LookingGlassEvaluator .evaluator-results, .lg-dialog .actor-link {
+ font-family: monospace; }
+
+.unlock-dialog-clock .unlock-dialog-clock-time, #panel, .weather-button .weather-box .weather-grid .weather-forecast-temp, .world-clocks-button .world-clocks-grid .world-clocks-timezone, .world-clocks-button .world-clocks-grid .world-clocks-time, .events-button .events-box .events-list .event-box .event-time, .calendar .calendar-day-heading, .calendar .calendar-day {
+ font-feature-settings: "tnum"; }
+
+/* OSD Elements */
+#LookingGlassDialog, .screenshot-ui-panel, .workspace-switcher, .switcher-list, .resize-popup, .osd-window {
+ color: #ffffff;
- background-color: #474747;
++ background-color: #2e2e33;
+ border: 1px solid rgba(255, 255, 255, 0.02);
+ border-radius: 999px;
+ padding: 12px; }
+
+.lg-dialog StEntry {
- background-color: #515151;
++ background-color: #414146;
+ color: rgba(255, 255, 255, 0.7); }
+ .lg-dialog StEntry:hover {
- box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.5) !important;
- background-color: st-mix(-st-accent-color, #474747, 5%);
++ background-color: #4b4b51;
+ color: #ffffff; }
+ .lg-dialog StEntry:focus {
- background-color: #3f3f3f;
++ box-shadow: inset 0 0 0 2px st-transparentize(st-mix(-st-accent-color, #ffffff, 60%), 0.2) !important;
++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), #414146, 5%);
+ color: #ffffff; }
+ .lg-dialog StEntry:insensitive {
- background-color: st-mix(#ffffff, #353535, 9%); }
++ background-color: #3a3a3e;
+ color: rgba(255, 255, 255, 0.5); }
+ .lg-dialog StEntry StLabel.hint-text {
+ color: rgba(255, 255, 255, 0.7); }
+
+#LookingGlassDebugFlags .lg-debug-flag-button, #LookingGlassPropertyInspector .lg-obj-inspector-close-button,
+#LookingGlassPropertyInspector .lg-obj-inspector-button, #LookingGlassDialog > #Toolbar .lg-toolbar-button {
+ color: #ffffff;
- box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.5) !important;
- background-color: st-mix(-st-accent-color, st-mix(#ffffff, #353535, 9%), 5%); }
++ background-color: st-mix(#ffffff, #2e2e33, 9%); }
+ #LookingGlassDebugFlags .lg-debug-flag-button:focus, #LookingGlassPropertyInspector .lg-obj-inspector-close-button:focus,
+ #LookingGlassPropertyInspector .lg-obj-inspector-button:focus, #LookingGlassDialog > #Toolbar .lg-toolbar-button:focus {
+ color: #ffffff;
- background-color: st-mix(-st-accent-color, st-lighten(st-mix(#ffffff, #353535, 9%), 4%), 5%); }
++ box-shadow: inset 0 0 0 2px st-transparentize(st-mix(-st-accent-color, #ffffff, 60%), 0.2) !important;
++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(#ffffff, #2e2e33, 9%), 5%); }
+ #LookingGlassDebugFlags .lg-debug-flag-button:focus:hover, #LookingGlassPropertyInspector .lg-obj-inspector-close-button:focus:hover,
+ #LookingGlassPropertyInspector .lg-obj-inspector-button:focus:hover, #LookingGlassDialog > #Toolbar .lg-toolbar-button:focus:hover {
- background-color: st-lighten(st-mix(#ffffff, #353535, 9%), 4%); }
++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-lighten(st-mix(#ffffff, #2e2e33, 9%), 4%), 5%); }
+ #LookingGlassDebugFlags .lg-debug-flag-button:hover, #LookingGlassPropertyInspector .lg-obj-inspector-close-button:hover,
+ #LookingGlassPropertyInspector .lg-obj-inspector-button:hover, #LookingGlassDialog > #Toolbar .lg-toolbar-button:hover {
+ color: #ffffff;
- background-color: st-lighten(st-mix(#ffffff, #353535, 9%), 9%); }
++ background-color: st-lighten(st-mix(#ffffff, #2e2e33, 9%), 4%); }
+ #LookingGlassDebugFlags .lg-debug-flag-button:active, #LookingGlassPropertyInspector .lg-obj-inspector-close-button:active,
+ #LookingGlassPropertyInspector .lg-obj-inspector-button:active, #LookingGlassDialog > #Toolbar .lg-toolbar-button:active {
+ color: #ffffff;
- background-color: st-lighten(st-lighten(st-mix(#ffffff, #353535, 9%), 9%), 4%); }
++ background-color: st-lighten(st-mix(#ffffff, #2e2e33, 9%), 9%); }
+ #LookingGlassDebugFlags .lg-debug-flag-button:active:hover, #LookingGlassPropertyInspector .lg-obj-inspector-close-button:active:hover,
+ #LookingGlassPropertyInspector .lg-obj-inspector-button:active:hover, #LookingGlassDialog > #Toolbar .lg-toolbar-button:active:hover {
- background-color: st-mix(-st-accent-color, st-lighten(st-mix(#ffffff, #353535, 9%), 9%), 5%); }
++ background-color: st-lighten(st-lighten(st-mix(#ffffff, #2e2e33, 9%), 9%), 4%); }
+ #LookingGlassDebugFlags .lg-debug-flag-button:active:focus, #LookingGlassPropertyInspector .lg-obj-inspector-close-button:active:focus,
+ #LookingGlassPropertyInspector .lg-obj-inspector-button:active:focus, #LookingGlassDialog > #Toolbar .lg-toolbar-button:active:focus {
- background-color: st-lighten(st-mix(#ffffff, #353535, 9%), 8%); }
++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-lighten(st-mix(#ffffff, #2e2e33, 9%), 9%), 5%); }
+ #LookingGlassDebugFlags .lg-debug-flag-button:checked, #LookingGlassPropertyInspector .lg-obj-inspector-close-button:checked,
+ #LookingGlassPropertyInspector .lg-obj-inspector-button:checked, #LookingGlassDialog > #Toolbar .lg-toolbar-button:checked {
+ color: #ffffff;
- background-color: st-lighten(st-lighten(st-mix(#ffffff, #353535, 9%), 8%), 4%); }
++ background-color: st-lighten(st-mix(#ffffff, #2e2e33, 9%), 8%); }
+ #LookingGlassDebugFlags .lg-debug-flag-button:checked:hover, #LookingGlassPropertyInspector .lg-obj-inspector-close-button:checked:hover,
+ #LookingGlassPropertyInspector .lg-obj-inspector-button:checked:hover, #LookingGlassDialog > #Toolbar .lg-toolbar-button:checked:hover {
- background-color: st-lighten(st-lighten(st-mix(#ffffff, #353535, 9%), 8%), 9%); }
++ background-color: st-lighten(st-lighten(st-mix(#ffffff, #2e2e33, 9%), 8%), 4%); }
+ #LookingGlassDebugFlags .lg-debug-flag-button:checked:active, #LookingGlassPropertyInspector .lg-obj-inspector-close-button:checked:active,
+ #LookingGlassPropertyInspector .lg-obj-inspector-button:checked:active, #LookingGlassDialog > #Toolbar .lg-toolbar-button:checked:active {
- background-color: st-darken(st-mix(#ffffff, #353535, 9%), 3%); }
++ background-color: st-lighten(st-lighten(st-mix(#ffffff, #2e2e33, 9%), 8%), 9%); }
+ #LookingGlassDebugFlags .lg-debug-flag-button:insensitive, #LookingGlassPropertyInspector .lg-obj-inspector-close-button:insensitive,
+ #LookingGlassPropertyInspector .lg-obj-inspector-button:insensitive, #LookingGlassDialog > #Toolbar .lg-toolbar-button:insensitive {
+ color: st-transparentize(#ffffff, 0.5);
- background-color: #353535; }
++ background-color: st-darken(st-mix(#ffffff, #2e2e33, 9%), 3%); }
+
+#LookingGlassDialog .notebook-tab, .screenshot-ui-show-pointer-button, .screenshot-ui-type-button {
+ color: #ffffff;
- box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.5) !important;
- background-color: st-mix(-st-accent-color, rgba(53, 53, 53, 0.25), 5%); }
++ background-color: #2e2e33; }
+ #LookingGlassDialog .notebook-tab:focus, .screenshot-ui-show-pointer-button:focus, .screenshot-ui-type-button:focus {
+ color: #ffffff;
- background-color: st-mix(-st-accent-color, st-lighten(#353535, 7%), 5%); }
++ box-shadow: inset 0 0 0 2px st-transparentize(st-mix(-st-accent-color, #ffffff, 60%), 0.2) !important;
++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), rgba(46, 46, 51, 0.25), 5%); }
+ #LookingGlassDialog .notebook-tab:focus:hover, .screenshot-ui-show-pointer-button:focus:hover, .screenshot-ui-type-button:focus:hover {
- background-color: st-lighten(#353535, 7%); }
++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-lighten(#2e2e33, 7%), 5%); }
+ #LookingGlassDialog .notebook-tab:hover, .screenshot-ui-show-pointer-button:hover, .screenshot-ui-type-button:hover {
+ color: #ffffff;
- background-color: st-lighten(#353535, 9%); }
++ background-color: st-lighten(#2e2e33, 7%); }
+ #LookingGlassDialog .notebook-tab:active, .screenshot-ui-show-pointer-button:active, .screenshot-ui-type-button:active {
+ color: #ffffff;
- background-color: st-lighten(st-lighten(#353535, 9%), 7%); }
++ background-color: st-lighten(#2e2e33, 9%); }
+ #LookingGlassDialog .notebook-tab:active:hover, .screenshot-ui-show-pointer-button:active:hover, .screenshot-ui-type-button:active:hover {
- background-color: st-mix(-st-accent-color, st-lighten(#353535, 9%), 5%); }
++ background-color: st-lighten(st-lighten(#2e2e33, 9%), 7%); }
+ #LookingGlassDialog .notebook-tab:active:focus, .screenshot-ui-show-pointer-button:active:focus, .screenshot-ui-type-button:active:focus {
- background-color: st-lighten(#353535, 8%); }
++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-lighten(#2e2e33, 9%), 5%); }
+ #LookingGlassDialog .notebook-tab:checked, .screenshot-ui-show-pointer-button:checked, .screenshot-ui-type-button:checked {
+ color: #ffffff;
- background-color: st-lighten(st-lighten(#353535, 8%), 7%); }
++ background-color: st-lighten(#2e2e33, 8%); }
+ #LookingGlassDialog .notebook-tab:checked:hover, .screenshot-ui-show-pointer-button:checked:hover, .screenshot-ui-type-button:checked:hover {
- background-color: st-lighten(st-lighten(#353535, 8%), 9%); }
++ background-color: st-lighten(st-lighten(#2e2e33, 8%), 7%); }
+ #LookingGlassDialog .notebook-tab:checked:active, .screenshot-ui-show-pointer-button:checked:active, .screenshot-ui-type-button:checked:active {
- background-color: #353535; }
++ background-color: st-lighten(st-lighten(#2e2e33, 8%), 9%); }
+ #LookingGlassDialog .notebook-tab:insensitive, .screenshot-ui-show-pointer-button:insensitive, .screenshot-ui-type-button:insensitive {
+ color: st-transparentize(#ffffff, 0.5);
- background-color: #464646;
- color: rgba(245, 245, 245, 0.7); }
++ background-color: #2e2e33; }
+
+/* System Elements */
+.login-dialog .login-dialog-prompt-entry, .app-folder-dialog .folder-name-container .folder-name-entry, .search-entry {
- background-color: #505050;
- color: whitesmoke; }
++ background-color: #404045;
++ color: rgba(250, 250, 251, 0.7); }
+ .login-dialog .login-dialog-prompt-entry:hover, .app-folder-dialog .folder-name-container .folder-name-entry:hover, .search-entry:hover {
- box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.5) !important;
- background-color: st-mix(-st-accent-color, #464646, 5%);
- color: whitesmoke; }
++ background-color: #4a4a50;
++ color: #fafafb; }
+ .login-dialog .login-dialog-prompt-entry:focus, .app-folder-dialog .folder-name-container .folder-name-entry:focus, .search-entry:focus {
- background-color: #3e3e3e;
- color: rgba(245, 245, 245, 0.5); }
++ box-shadow: inset 0 0 0 2px st-transparentize(st-mix(-st-accent-color, #ffffff, 60%), 0.2) !important;
++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), #404045, 5%);
++ color: #fafafb; }
+ .login-dialog .login-dialog-prompt-entry:insensitive, .app-folder-dialog .folder-name-container .folder-name-entry:insensitive, .search-entry:insensitive {
- color: rgba(245, 245, 245, 0.7); }
++ background-color: #39393d;
++ color: rgba(250, 250, 251, 0.5); }
+ .login-dialog .login-dialog-prompt-entry StLabel.hint-text, .app-folder-dialog .folder-name-container .folder-name-entry StLabel.hint-text, .search-entry StLabel.hint-text {
- color: whitesmoke;
- background-color: st-mix(whitesmoke, #353535, 9%); }
++ color: rgba(250, 250, 251, 0.7); }
+
+.login-dialog-button.cancel-button, .login-dialog-button.switch-user-button, .login-dialog-button.login-dialog-session-list-button {
- color: st-transparentize(whitesmoke, 0.5);
- background-color: st-darken(st-mix(whitesmoke, #353535, 9%), 3%); }
++ color: #fafafb;
++ background-color: st-mix(#fafafb, #2e2e33, 9%); }
+ .login-dialog-button.cancel-button:insensitive, .login-dialog-button.switch-user-button:insensitive, .login-dialog-button.login-dialog-session-list-button:insensitive {
- color: whitesmoke;
- box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.5) !important;
- background-color: st-mix(-st-accent-color, st-mix(whitesmoke, #353535, 9%), 5%); }
++ color: st-transparentize(#fafafb, 0.5);
++ background-color: st-darken(st-mix(#fafafb, #2e2e33, 9%), 3%); }
+ .login-dialog-button.cancel-button:focus, .login-dialog-button.switch-user-button:focus, .login-dialog-button.login-dialog-session-list-button:focus {
- background-color: st-mix(-st-accent-color, st-lighten(st-mix(whitesmoke, #353535, 9%), 4%), 5%); }
++ color: #fafafb;
++ box-shadow: inset 0 0 0 2px st-transparentize(st-mix(-st-accent-color, #ffffff, 60%), 0.2) !important;
++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(#fafafb, #2e2e33, 9%), 5%); }
+ .login-dialog-button.cancel-button:focus:hover, .login-dialog-button.switch-user-button:focus:hover, .login-dialog-button.login-dialog-session-list-button:focus:hover {
- color: whitesmoke;
- background-color: st-lighten(st-mix(whitesmoke, #353535, 9%), 4%); }
++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-lighten(st-mix(#fafafb, #2e2e33, 9%), 4%), 5%); }
+ .login-dialog-button.cancel-button:hover, .login-dialog-button.switch-user-button:hover, .login-dialog-button.login-dialog-session-list-button:hover {
- color: whitesmoke;
- background-color: st-lighten(st-mix(whitesmoke, #353535, 9%), 9%); }
++ color: #fafafb;
++ background-color: st-lighten(st-mix(#fafafb, #2e2e33, 9%), 4%); }
+ .login-dialog-button.cancel-button:active, .login-dialog-button.switch-user-button:active, .login-dialog-button.login-dialog-session-list-button:active {
- background-color: st-lighten(st-lighten(st-mix(whitesmoke, #353535, 9%), 9%), 4%); }
++ color: #fafafb;
++ background-color: st-lighten(st-mix(#fafafb, #2e2e33, 9%), 9%); }
+ .login-dialog-button.cancel-button:active:hover, .login-dialog-button.switch-user-button:active:hover, .login-dialog-button.login-dialog-session-list-button:active:hover {
- background-color: st-mix(-st-accent-color, st-lighten(st-mix(whitesmoke, #353535, 9%), 9%), 5%); }
++ background-color: st-lighten(st-lighten(st-mix(#fafafb, #2e2e33, 9%), 9%), 4%); }
+ .login-dialog-button.cancel-button:active:focus, .login-dialog-button.switch-user-button:active:focus, .login-dialog-button.login-dialog-session-list-button:active:focus {
- color: whitesmoke;
- background-color: st-lighten(st-mix(whitesmoke, #353535, 9%), 8%); }
++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-lighten(st-mix(#fafafb, #2e2e33, 9%), 9%), 5%); }
+ .login-dialog-button.cancel-button:checked, .login-dialog-button.switch-user-button:checked, .login-dialog-button.login-dialog-session-list-button:checked {
- background-color: st-lighten(st-lighten(st-mix(whitesmoke, #353535, 9%), 8%), 4%); }
++ color: #fafafb;
++ background-color: st-lighten(st-mix(#fafafb, #2e2e33, 9%), 8%); }
+ .login-dialog-button.cancel-button:checked:hover, .login-dialog-button.switch-user-button:checked:hover, .login-dialog-button.login-dialog-session-list-button:checked:hover {
- background-color: st-lighten(st-lighten(st-mix(whitesmoke, #353535, 9%), 8%), 9%); }
++ background-color: st-lighten(st-lighten(st-mix(#fafafb, #2e2e33, 9%), 8%), 4%); }
+ .login-dialog-button.cancel-button:checked:active, .login-dialog-button.switch-user-button:checked:active, .login-dialog-button.login-dialog-session-list-button:checked:active {
- color: whitesmoke;
- background-color: rgba(245, 245, 245, 0.1); }
++ background-color: st-lighten(st-lighten(st-mix(#fafafb, #2e2e33, 9%), 8%), 9%); }
+
+/* Lockscreen Elements */
+.unlock-dialog .button,
+.unlock-dialog .icon-button,
+.unlock-dialog .calendar .calendar-month-header .pager-button,
+.calendar .calendar-month-header .unlock-dialog .pager-button,
+.unlock-dialog .message .message-header .message-expand-button,
+.message .message-header .unlock-dialog .message-expand-button,
+.unlock-dialog .message .message-header .message-close-button,
+.message .message-header .unlock-dialog .message-close-button,
+.unlock-dialog .screenshot-ui-show-pointer-button,
+.unlock-dialog .login-dialog-button.cancel-button,
+.unlock-dialog .login-dialog-button.switch-user-button,
+.unlock-dialog .login-dialog-button.login-dialog-session-list-button {
- color: whitesmoke;
- box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.5) !important;
- background-color: st-mix(-st-accent-color, rgba(245, 245, 245, 0.1), 5%); }
++ color: #fafafb;
++ background-color: rgba(250, 250, 251, 0.1); }
+ .unlock-dialog .button:focus,
+ .unlock-dialog .icon-button:focus,
+ .unlock-dialog .calendar .calendar-month-header .pager-button:focus,
+ .calendar .calendar-month-header .unlock-dialog .pager-button:focus,
+ .unlock-dialog .message .message-header .message-expand-button:focus,
+ .message .message-header .unlock-dialog .message-expand-button:focus,
+ .unlock-dialog .message .message-header .message-close-button:focus,
+ .message .message-header .unlock-dialog .message-close-button:focus,
+ .unlock-dialog .screenshot-ui-show-pointer-button:focus,
+ .unlock-dialog .login-dialog-button.cancel-button:focus,
+ .unlock-dialog .login-dialog-button.switch-user-button:focus,
+ .unlock-dialog .login-dialog-button.login-dialog-session-list-button:focus {
- background-color: st-mix(-st-accent-color, rgba(245, 245, 245, 0.13), 5%); }
++ color: #fafafb;
++ box-shadow: inset 0 0 0 2px st-transparentize(st-mix(-st-accent-color, #ffffff, 60%), 0.2) !important;
++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), rgba(250, 250, 251, 0.1), 5%); }
+ .unlock-dialog .button:focus:hover,
+ .unlock-dialog .icon-button:focus:hover,
+ .unlock-dialog .calendar .calendar-month-header .pager-button:focus:hover,
+ .calendar .calendar-month-header .unlock-dialog .pager-button:focus:hover,
+ .unlock-dialog .message .message-header .message-expand-button:focus:hover,
+ .message .message-header .unlock-dialog .message-expand-button:focus:hover,
+ .unlock-dialog .message .message-header .message-close-button:focus:hover,
+ .message .message-header .unlock-dialog .message-close-button:focus:hover,
+ .unlock-dialog .screenshot-ui-show-pointer-button:focus:hover,
+ .unlock-dialog .login-dialog-button.cancel-button:focus:hover,
+ .unlock-dialog .login-dialog-button.switch-user-button:focus:hover,
+ .unlock-dialog .login-dialog-button.login-dialog-session-list-button:focus:hover {
- color: whitesmoke;
- background-color: rgba(245, 245, 245, 0.13); }
++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), rgba(250, 250, 251, 0.13), 5%); }
+ .unlock-dialog .button:hover,
+ .unlock-dialog .icon-button:hover,
+ .unlock-dialog .calendar .calendar-month-header .pager-button:hover,
+ .calendar .calendar-month-header .unlock-dialog .pager-button:hover,
+ .unlock-dialog .message .message-header .message-expand-button:hover,
+ .message .message-header .unlock-dialog .message-expand-button:hover,
+ .unlock-dialog .message .message-header .message-close-button:hover,
+ .message .message-header .unlock-dialog .message-close-button:hover,
+ .unlock-dialog .screenshot-ui-show-pointer-button:hover,
+ .unlock-dialog .login-dialog-button.cancel-button:hover,
+ .unlock-dialog .login-dialog-button.switch-user-button:hover,
+ .unlock-dialog .login-dialog-button.login-dialog-session-list-button:hover {
- color: whitesmoke;
- background-color: rgba(245, 245, 245, 0.16); }
++ color: #fafafb;
++ background-color: rgba(250, 250, 251, 0.13); }
+ .unlock-dialog .button:active,
+ .unlock-dialog .icon-button:active,
+ .unlock-dialog .calendar .calendar-month-header .pager-button:active,
+ .calendar .calendar-month-header .unlock-dialog .pager-button:active,
+ .unlock-dialog .message .message-header .message-expand-button:active,
+ .message .message-header .unlock-dialog .message-expand-button:active,
+ .unlock-dialog .message .message-header .message-close-button:active,
+ .message .message-header .unlock-dialog .message-close-button:active,
+ .unlock-dialog .screenshot-ui-show-pointer-button:active,
+ .unlock-dialog .login-dialog-button.cancel-button:active,
+ .unlock-dialog .login-dialog-button.switch-user-button:active,
+ .unlock-dialog .login-dialog-button.login-dialog-session-list-button:active {
- background-color: rgba(245, 245, 245, 0.19); }
++ color: #fafafb;
++ background-color: rgba(250, 250, 251, 0.16); }
+ .unlock-dialog .button:active:hover,
+ .unlock-dialog .icon-button:active:hover,
+ .unlock-dialog .calendar .calendar-month-header .pager-button:active:hover,
+ .calendar .calendar-month-header .unlock-dialog .pager-button:active:hover,
+ .unlock-dialog .message .message-header .message-expand-button:active:hover,
+ .message .message-header .unlock-dialog .message-expand-button:active:hover,
+ .unlock-dialog .message .message-header .message-close-button:active:hover,
+ .message .message-header .unlock-dialog .message-close-button:active:hover,
+ .unlock-dialog .screenshot-ui-show-pointer-button:active:hover,
+ .unlock-dialog .login-dialog-button.cancel-button:active:hover,
+ .unlock-dialog .login-dialog-button.switch-user-button:active:hover,
+ .unlock-dialog .login-dialog-button.login-dialog-session-list-button:active:hover {
- background-color: st-mix(-st-accent-color, rgba(245, 245, 245, 0.16), 5%); }
++ background-color: rgba(250, 250, 251, 0.19); }
+ .unlock-dialog .button:active:focus,
+ .unlock-dialog .icon-button:active:focus,
+ .unlock-dialog .calendar .calendar-month-header .pager-button:active:focus,
+ .calendar .calendar-month-header .unlock-dialog .pager-button:active:focus,
+ .unlock-dialog .message .message-header .message-expand-button:active:focus,
+ .message .message-header .unlock-dialog .message-expand-button:active:focus,
+ .unlock-dialog .message .message-header .message-close-button:active:focus,
+ .message .message-header .unlock-dialog .message-close-button:active:focus,
+ .unlock-dialog .screenshot-ui-show-pointer-button:active:focus,
+ .unlock-dialog .login-dialog-button.cancel-button:active:focus,
+ .unlock-dialog .login-dialog-button.switch-user-button:active:focus,
+ .unlock-dialog .login-dialog-button.login-dialog-session-list-button:active:focus {
- color: whitesmoke;
- background-color: st-lighten(st-mix(whitesmoke, #353535, 9%), 8%); }
++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), rgba(250, 250, 251, 0.16), 5%); }
+ .unlock-dialog .button:checked,
+ .unlock-dialog .icon-button:checked,
+ .unlock-dialog .calendar .calendar-month-header .pager-button:checked,
+ .calendar .calendar-month-header .unlock-dialog .pager-button:checked,
+ .unlock-dialog .message .message-header .message-expand-button:checked,
+ .message .message-header .unlock-dialog .message-expand-button:checked,
+ .unlock-dialog .message .message-header .message-close-button:checked,
+ .message .message-header .unlock-dialog .message-close-button:checked,
+ .unlock-dialog .screenshot-ui-show-pointer-button:checked,
+ .unlock-dialog .login-dialog-button.cancel-button:checked,
+ .unlock-dialog .login-dialog-button.switch-user-button:checked,
+ .unlock-dialog .login-dialog-button.login-dialog-session-list-button:checked {
- background-color: st-lighten(st-lighten(st-mix(whitesmoke, #353535, 9%), 8%), 4%); }
++ color: #fafafb;
++ background-color: st-lighten(st-mix(#fafafb, #36363a, 9%), 8%); }
+ .unlock-dialog .button:checked:hover,
+ .unlock-dialog .icon-button:checked:hover,
+ .unlock-dialog .calendar .calendar-month-header .pager-button:checked:hover,
+ .calendar .calendar-month-header .unlock-dialog .pager-button:checked:hover,
+ .unlock-dialog .message .message-header .message-expand-button:checked:hover,
+ .message .message-header .unlock-dialog .message-expand-button:checked:hover,
+ .unlock-dialog .message .message-header .message-close-button:checked:hover,
+ .message .message-header .unlock-dialog .message-close-button:checked:hover,
+ .unlock-dialog .screenshot-ui-show-pointer-button:checked:hover,
+ .unlock-dialog .login-dialog-button.cancel-button:checked:hover,
+ .unlock-dialog .login-dialog-button.switch-user-button:checked:hover,
+ .unlock-dialog .login-dialog-button.login-dialog-session-list-button:checked:hover {
- background-color: st-lighten(st-lighten(st-mix(whitesmoke, #353535, 9%), 8%), 9%); }
++ background-color: st-lighten(st-lighten(st-mix(#fafafb, #36363a, 9%), 8%), 4%); }
+ .unlock-dialog .button:checked:active,
+ .unlock-dialog .icon-button:checked:active,
+ .unlock-dialog .calendar .calendar-month-header .pager-button:checked:active,
+ .calendar .calendar-month-header .unlock-dialog .pager-button:checked:active,
+ .unlock-dialog .message .message-header .message-expand-button:checked:active,
+ .message .message-header .unlock-dialog .message-expand-button:checked:active,
+ .unlock-dialog .message .message-header .message-close-button:checked:active,
+ .message .message-header .unlock-dialog .message-close-button:checked:active,
+ .unlock-dialog .screenshot-ui-show-pointer-button:checked:active,
+ .unlock-dialog .login-dialog-button.cancel-button:checked:active,
+ .unlock-dialog .login-dialog-button.switch-user-button:checked:active,
+ .unlock-dialog .login-dialog-button.login-dialog-session-list-button:checked:active {
- color: st-transparentize(whitesmoke, 0.5);
- background-color: st-darken(st-mix(whitesmoke, #353535, 9%), 3%); }
++ background-color: st-lighten(st-lighten(st-mix(#fafafb, #36363a, 9%), 8%), 9%); }
+ .unlock-dialog .button:insensitive,
+ .unlock-dialog .icon-button:insensitive,
+ .unlock-dialog .calendar .calendar-month-header .pager-button:insensitive,
+ .calendar .calendar-month-header .unlock-dialog .pager-button:insensitive,
+ .unlock-dialog .message .message-header .message-expand-button:insensitive,
+ .message .message-header .unlock-dialog .message-expand-button:insensitive,
+ .unlock-dialog .message .message-header .message-close-button:insensitive,
+ .message .message-header .unlock-dialog .message-close-button:insensitive,
+ .unlock-dialog .screenshot-ui-show-pointer-button:insensitive,
+ .unlock-dialog .login-dialog-button.cancel-button:insensitive,
+ .unlock-dialog .login-dialog-button.switch-user-button:insensitive,
+ .unlock-dialog .login-dialog-button.login-dialog-session-list-button:insensitive {
- background-color: rgba(245, 245, 245, 0.1);
- color: rgba(245, 245, 245, 0.7); }
++ color: st-transparentize(#fafafb, 0.5);
++ background-color: st-darken(st-mix(#fafafb, #36363a, 9%), 3%); }
+
+.unlock-dialog .login-dialog-prompt-entry {
- color: whitesmoke; }
++ background-color: rgba(250, 250, 251, 0.1);
++ color: rgba(250, 250, 251, 0.7); }
+ .unlock-dialog .login-dialog-prompt-entry:hover {
+ background-color: rgba(255, 255, 255, 0.1);
- box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.5) !important;
- background-color: st-mix(-st-accent-color, rgba(245, 245, 245, 0.1), 5%);
- color: whitesmoke;
- box-shadow: inset 0 0 0 2px rgba(245, 245, 245, 0.4) !important;
- background-color: st-mix(rgba(245, 245, 245, 0.4), rgba(245, 245, 245, 0.1), 5%); }
++ color: #fafafb; }
+ .unlock-dialog .login-dialog-prompt-entry:focus {
- background-color: rgba(237, 237, 237, 0.1);
- color: rgba(245, 245, 245, 0.5); }
++ box-shadow: inset 0 0 0 2px st-transparentize(rgba(250, 250, 251, 0.4), 0.2) !important;
++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), rgba(250, 250, 251, 0.1), 5%);
++ color: #fafafb;
++ box-shadow: inset 0 0 0 2px st-transparentize(rgba(250, 250, 251, 0.4), 0.2) !important;
++ background-color: st-mix(rgba(250, 250, 251, 0.4), rgba(250, 250, 251, 0.1), 5%); }
+ .unlock-dialog .login-dialog-prompt-entry:insensitive {
- color: rgba(245, 245, 245, 0.7); }
++ background-color: rgba(242, 242, 244, 0.1);
++ color: rgba(250, 250, 251, 0.5); }
+ .unlock-dialog .login-dialog-prompt-entry StLabel.hint-text {
- warning-color: #f6d32d;
++ color: rgba(250, 250, 251, 0.7); }
+
+/* WIDGETS */
+.shell-link {
+ color: st-lighten(-st-accent-color, 20%); }
+ .shell-link:hover {
+ color: st-lighten(st-lighten(-st-accent-color, 20%), 10%); }
+
+.lowres-icon {
+ icon-shadow: 0 1px 2px rgba(0, 0, 0, 0.2); }
+
+.icon-dropshadow {
+ icon-shadow: 0 2px 4px rgba(0, 0, 0, 0.4); }
+
+/* Entries */
+StEntry StIcon.capslock-warning {
+ icon-size: 1.091em;
- background: #d7d7d7;
++ warning-color: #cd9309;
+ padding: 0 4px; }
+
+StEntry StIcon.peek-password {
+ icon-size: 1.091em;
+ padding: 0 4px; }
+
+StEntry StLabel.hint-text {
+ margin-left: 2px; }
+
+/* Buttons */
+.button {
+ min-height: 1.5em; }
+
+.icon-button, .login-dialog-button.cancel-button, .login-dialog-button.switch-user-button, .login-dialog-button.login-dialog-session-list-button, .screenshot-ui-show-pointer-button, .message .message-header .message-expand-button,
+.message .message-header .message-close-button, .calendar .calendar-month-header .pager-button {
+ border-radius: 999px;
+ padding: 0.818em;
+ min-height: 1.091em; }
+ .icon-button StIcon, .login-dialog-button.cancel-button StIcon, .login-dialog-button.switch-user-button StIcon, .login-dialog-button.login-dialog-session-list-button StIcon, .screenshot-ui-show-pointer-button StIcon, .message .message-header .message-expand-button StIcon,
+ .message .message-header .message-close-button StIcon, .calendar .calendar-month-header .pager-button StIcon {
+ icon-size: 1.091em;
+ -st-icon-style: symbolic; }
+
+/* Check Boxes */
+.check-box StBoxLayout {
+ spacing: .8em; }
+
+.check-box StBin {
+ border-radius: 7px;
+ padding: 2px; }
+
+.check-box:focus StBin {
+ background-color: rgba(0, 0, 0, 0.01);
+ box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.65); }
+
+.check-box StIcon {
+ icon-size: 14px;
+ padding: 1px;
+ color: transparent;
+ border-radius: 6px;
+ border: 2px solid rgba(255, 255, 255, 0.15); }
+
+.check-box:hover StIcon {
+ border-color: rgba(255, 255, 255, 0.2); }
+
+.check-box:active StIcon {
+ border-color: rgba(255, 255, 255, 0.3); }
+
+.check-box:checked StIcon {
+ background-color: -st-accent-color;
+ color: -st-accent-fg-color;
+ border-color: transparent; }
+
+.check-box:checked:hover StIcon {
+ background-color: st-lighten(-st-accent-color, 5%);
+ color: st-lighten(-st-accent-fg-color, 5%); }
+
+.check-box:checked:active StIcon {
+ background-color: st-darken(-st-accent-color, 7%);
+ color: st-darken(-st-accent-fg-color, 7%); }
+
+/* Switches */
+.toggle-switch {
+ width: 46px;
+ border-radius: 999px;
+ transition-duration: 100ms;
+ color: #ffffff;
+ background: rgba(255, 255, 255, 0.15); }
+ .toggle-switch:hover {
+ background: rgba(255, 255, 255, 0.2); }
+ .toggle-switch StIcon {
+ icon-size: 16px; }
+ .toggle-switch .handle {
+ margin: 3px;
+ width: 20px;
+ height: 20px;
+ border-radius: 999px;
- background-color: #717171;
++ background: #d7d7d8;
+ box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2);
+ transition-duration: 100ms; }
+ .toggle-switch:checked {
+ background: -st-accent-color;
+ color: -st-accent-fg-color; }
+ .toggle-switch:checked:hover {
+ background-color: st-lighten(-st-accent-color, 5%);
+ color: st-lighten(-st-accent-fg-color, 5%); }
+ .toggle-switch:checked .handle {
+ background: white; }
+
+/* Slider */
+.slider {
+ color: #e8e8e8;
+ -barlevel-height: 4px;
+ -barlevel-background-color: rgba(255, 255, 255, 0.1);
+ -barlevel-active-background-color: -st-accent-color;
+ -barlevel-overdrive-color: #c01c28;
+ -barlevel-overdrive-separator-width: 1px;
+ -slider-handle-radius: 0.5455em; }
+ .slider:hover {
+ color: #ffffff; }
+
+/* Scrollbars */
+StScrollView.vfade {
+ -st-vfade-offset: 68px; }
+
+StScrollView.hfade {
+ -st-hfade-offset: 68px; }
+
+StScrollBar {
+ padding: 0; }
+ StScrollView StScrollBar {
+ min-width: 8px;
+ min-height: 8px; }
+ StScrollBar StBin#trough {
+ border-radius: 0;
+ background-color: transparent; }
+ StScrollBar StButton#vhandle, StScrollBar StButton#hhandle {
+ border-radius: 8px;
- background-color: #9a9a9a; }
++ background-color: #727275;
+ border: 3px solid transparent;
+ transition: 500ms all ease; }
+ StScrollBar StButton#vhandle:hover, StScrollBar StButton#hhandle:hover {
- background-color: #868686; }
++ background-color: #9b9b9d; }
+ StScrollBar StButton#vhandle:active, StScrollBar StButton#hhandle:active {
- background-color: #353535;
++ background-color: #868689; }
+
+/* Popovers/Menus */
+.popup-menu-boxpointer, .candidate-popup-boxpointer {
+ -arrow-rise: 6px; }
+
+.popup-menu {
+ min-width: 15em;
+ color: #ffffff; }
+ .popup-menu.panel-menu {
+ margin-bottom: 1.75em; }
+
+.popup-menu-content, .candidate-popup-content {
+ padding: 6px;
- border: 1px solid #424242;
++ background-color: #36363a;
+ border-radius: 20px;
- .popup-menu-item:hover {
- color: #ffffff;
- background-color: st-lighten(st-mix(#ffffff, #424242, 9%), 4%); }
++ border: 1px solid #424247;
+ box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.2); }
+
+.popup-menu-item {
+ background-color: transparent;
+ border-color: transparent;
+ box-shadow: none;
+ border-radius: 12px; }
+ .popup-menu-item:insensitive {
+ background-color: transparent !important; }
- background-color: st-lighten(st-mix(#ffffff, #424242, 9%), 9%); }
+ .popup-menu-item:active {
+ color: #ffffff;
- background-color: st-lighten(st-lighten(st-mix(#ffffff, #424242, 9%), 9%), 4%); }
++ background-color: st-lighten(#424247, 9%); }
+ .popup-menu-item:active:hover {
- background-color: st-mix(-st-accent-color, st-lighten(st-mix(#ffffff, #424242, 9%), 9%), 5%); }
- .popup-menu-item:selected, .popup-menu-item:checked {
++ background-color: st-lighten(st-lighten(#424247, 9%), 7%); }
+ .popup-menu-item:active:focus {
- background-color: st-lighten(st-mix(#ffffff, #424242, 9%), 8%); }
- .popup-menu-item:selected:hover, .popup-menu-item:checked:hover {
- background-color: st-lighten(st-lighten(st-mix(#ffffff, #424242, 9%), 8%), 4%); }
- .popup-menu-item:selected:active, .popup-menu-item:checked:active {
- background-color: st-lighten(st-lighten(st-mix(#ffffff, #424242, 9%), 8%), 9%); }
++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-lighten(#424247, 9%), 5%); }
++ .popup-menu-item:hover, .popup-menu-item:selected, .popup-menu-item:checked {
+ color: #ffffff;
- background-color: st-darken(st-mix(#ffffff, #424242, 9%), 3%); }
++ background-color: st-lighten(#424247, 7%); }
+ .popup-menu-item:insensitive {
+ color: st-transparentize(#ffffff, 0.5);
- color: #9a9a9a; }
++ background-color: #424247; }
+ .popup-menu-item:checked {
+ border-radius: 12px 12px 0 0 !important; }
+ .popup-menu-item .toggle-switch:ltr {
+ margin-left: 4px; }
+ .popup-menu-item .toggle-switch:rtl {
+ margin-right: 4px; }
+
+.popup-ornamented-menu-item:ltr {
+ padding-left: 6px; }
+
+.popup-ornamented-menu-item:rtl {
+ padding-right: 6px; }
+
+.popup-inactive-menu-item {
+ color: #ffffff; }
+ .popup-inactive-menu-item:insensitive {
- background-color: #565656; }
++ color: #9b9b9d; }
+
+.popup-menu-arrow,
+.popup-menu-icon {
+ icon-size: 1.091em; }
+
+.popup-sub-menu {
+ border-radius: 0 0 13px 13px;
+ margin-bottom: 6px;
+ border: 1px solid transparent;
- .popup-sub-menu .popup-menu-item:hover {
- color: #ffffff;
- background-color: st-lighten(st-mix(#ffffff, #565656, 9%), 4%); }
++ background-color: #56565c; }
+ .popup-sub-menu .popup-menu-item {
+ border-radius: 0;
+ border-top-width: 0;
+ background-color: transparent;
+ border-color: transparent;
+ box-shadow: none; }
+ .popup-sub-menu .popup-menu-item:insensitive {
+ background-color: transparent !important; }
- background-color: st-lighten(st-mix(#ffffff, #565656, 9%), 9%); }
+ .popup-sub-menu .popup-menu-item:active {
+ color: #ffffff;
- background-color: st-lighten(st-lighten(st-mix(#ffffff, #565656, 9%), 9%), 4%); }
++ background-color: st-lighten(#56565c, 9%); }
+ .popup-sub-menu .popup-menu-item:active:hover {
- background-color: st-mix(-st-accent-color, st-lighten(st-mix(#ffffff, #565656, 9%), 9%), 5%); }
- .popup-sub-menu .popup-menu-item:selected, .popup-sub-menu .popup-menu-item:checked {
++ background-color: st-lighten(st-lighten(#56565c, 9%), 7%); }
+ .popup-sub-menu .popup-menu-item:active:focus {
- background-color: st-lighten(st-mix(#ffffff, #565656, 9%), 8%); }
- .popup-sub-menu .popup-menu-item:selected:hover, .popup-sub-menu .popup-menu-item:checked:hover {
- background-color: st-lighten(st-lighten(st-mix(#ffffff, #565656, 9%), 8%), 4%); }
- .popup-sub-menu .popup-menu-item:selected:active, .popup-sub-menu .popup-menu-item:checked:active {
- background-color: st-lighten(st-lighten(st-mix(#ffffff, #565656, 9%), 8%), 9%); }
++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-lighten(#56565c, 9%), 5%); }
++ .popup-sub-menu .popup-menu-item:hover, .popup-sub-menu .popup-menu-item:selected, .popup-sub-menu .popup-menu-item:checked {
+ color: #ffffff;
- background-color: st-darken(st-mix(#ffffff, #565656, 9%), 3%); }
++ background-color: st-lighten(#56565c, 7%); }
+ .popup-sub-menu .popup-menu-item:insensitive {
+ color: st-transparentize(#ffffff, 0.5);
- color: #9a9a9a; }
++ background-color: #56565c; }
+ .popup-sub-menu .popup-menu-item:last-child {
+ border-radius: 0 0 12px 12px;
+ border-bottom-width: 0; }
+ .popup-sub-menu .popup-menu-section .popup-menu-item:last-child:hover, .popup-sub-menu .popup-menu-section .popup-menu-item:last-child:focus {
+ border-radius: 0; }
+ .popup-sub-menu .popup-menu-section:last-child .popup-menu-item:last-child {
+ border-radius: 0 0 12px 12px; }
+
+.popup-menu-ornament {
+ icon-size: 1.091em !important;
+ width: 1.091em; }
+
+.popup-separator-menu-item {
+ border: none !important; }
+ .popup-separator-menu-item .popup-separator-menu-item-separator {
+ height: 1px;
+ background-color: rgba(255, 255, 255, 0.1); }
+ .popup-sub-menu .popup-separator-menu-item {
+ background-color: transparent; }
+ .popup-sub-menu .popup-separator-menu-item:ltr {
+ margin-right: 2.5em; }
+ .popup-sub-menu .popup-separator-menu-item:rtl {
+ margin-left: 2.5em; }
+ .popup-sub-menu .popup-separator-menu-item .popup-separator-menu-item-separator {
+ background-color: rgba(255, 255, 255, 0.1); }
+
+.background-menu {
+ -boxpointer-gap: 0px;
+ -arrow-rise: 0px; }
+
+.app-menu {
+ max-width: 27.25em; }
+ .app-menu .popup-inactive-menu-item:first-child > StLabel:ltr {
+ margin-right: 8px; }
+ .app-menu .popup-inactive-menu-item:first-child > StLabel:rtl {
+ margin-left: 8px; }
+
+/* Date/Time Menu */
+#calendarArea {
+ padding: 4px; }
+
+.datemenu-popover {
+ border-radius: 30px; }
+
+.datemenu-calendar-column {
+ spacing: 6px; }
+ .datemenu-calendar-column:ltr {
+ margin-left: 6px; }
+ .datemenu-calendar-column:rtl {
+ margin-right: 6px; }
+ .datemenu-calendar-column .datemenu-displays-box {
+ spacing: 6px; }
+
+.datemenu-today-button {
+ padding: 9px; }
+ .datemenu-today-button .day-label {
+ font-weight: bold; }
+
+.calendar {
+ margin-top: 0;
+ padding: 0; }
+ .calendar .calendar-month-header .calendar-change-month-back StIcon,
+ .calendar .calendar-month-header .calendar-change-month-forward StIcon {
+ icon-size: 1.091em; }
+ .calendar .calendar-month-header .calendar-month-label {
+ color: #ffffff !important;
+ padding: 8px 0;
+ width: 10em;
+ border-radius: 999px;
+ text-align: center; }
+ .calendar .calendar-month-header .pager-button {
+ height: 2.6em;
+ width: 2.6em;
+ padding: 0; }
+ .calendar .calendar-day {
+ border-radius: 999px;
+ height: 3em;
+ width: 3em;
+ margin: 2px;
+ padding: 0;
+ font-weight: bold;
+ text-align: center; }
+ .calendar .calendar-day.calendar-weekend {
- background-color: rgba(154, 154, 154, 0.2);
- color: #9a9a9a; }
++ color: #9b9b9d; }
+ .calendar .calendar-day.calendar-other-month {
+ color: rgba(255, 255, 255, 0.5);
+ font-weight: normal; }
+ .calendar .calendar-day.calendar-other-month.calendar-weekend {
+ color: rgba(255, 255, 255, 0.5); }
+ .calendar .calendar-day.calendar-today {
+ color: -st-accent-fg-color !important; }
+ .calendar .calendar-day.calendar-today.calendar-day-with-events {
+ background-image: url("resource:///org/gnome/shell/theme/calendar-today.svg") !important; }
+ .calendar .calendar-day.calendar-day-with-events {
+ background-image: url("resource:///org/gnome/shell/theme/calendar-today.svg");
+ background-size: contain; }
+ .calendar .calendar-day-heading {
+ font-weight: bold;
+ text-align: center;
+ margin: 4px;
+ padding: 3px 6px;
+ border-radius: 8px; }
+ .calendar .calendar-week-number {
+ font-weight: bold;
+ font-feature-settings: "tnum";
+ text-align: center;
+ margin: 6px;
+ padding: 0 6px;
+ border-radius: 4px;
- color: #9a9a9a;
++ background-color: rgba(155, 155, 157, 0.2);
++ color: #9b9b9d; }
+
+.events-button .events-box .events-title {
- color: #9a9a9a; }
++ color: #9b9b9d;
+ padding-bottom: 6px; }
+
+.events-button .events-box .events-list {
+ spacing: 6px; }
+ .events-button .events-box .events-list .event-box {
+ spacing: 6px;
+ border-radius: 8px; }
+ .events-button .events-box .events-list .event-box .event-time {
- color: #9a9a9a;
++ color: #9b9b9d; }
+ .events-button .events-box .events-list .event-placeholder {
- color: #9a9a9a; }
++ color: #9b9b9d;
+ font-style: italic; }
+
+.world-clocks-button .world-clocks-header {
- color: #9a9a9a; }
++ color: #9b9b9d; }
+ .world-clocks-button .world-clocks-header.no-world-clocks {
+ color: #ffffff; }
+
+.world-clocks-button .world-clocks-grid {
+ spacing-rows: 6px;
+ spacing-columns: 12px; }
+ .world-clocks-button .world-clocks-grid .world-clocks-time {
+ font-weight: bold; }
+ .world-clocks-button .world-clocks-grid .world-clocks-time:ltr {
+ text-align: right; }
+ .world-clocks-button .world-clocks-grid .world-clocks-time:rtl {
+ text-align: left; }
+ .world-clocks-button .world-clocks-grid .world-clocks-timezone {
- color: #9a9a9a; }
++ color: #9b9b9d; }
+
+.weather-button .weather-box {
+ spacing: 6px; }
+ .weather-button .weather-box .weather-header-box {
+ spacing: 6px; }
+ .weather-button .weather-box .weather-header-box .weather-header {
- color: rgba(255, 255, 255, 0.25); }
++ color: #9b9b9d; }
+ .weather-button .weather-box .weather-header-box .weather-header.no-location {
+ color: #ffffff; }
+ .weather-button .weather-box .weather-header-box .weather-header.location {
+ font-weight: normal; }
+ .weather-button .weather-box .weather-grid {
+ spacing-rows: 6px;
+ spacing-columns: 12px; }
+ .weather-button .weather-box .weather-grid .weather-forecast-time {
+ padding-top: 6px;
+ padding-bottom: 6px; }
+ .weather-button .weather-box .weather-grid .weather-forecast-icon {
+ icon-size: 2.182em;
+ margin-bottom: 4px; }
+ .weather-button .weather-box .weather-grid .weather-forecast-temp {
+ font-weight: bold; }
+
+/* Message List */
+.message-list {
+ width: 29em;
+ border: solid rgba(255, 255, 255, 0.1); }
+ .message-list:ltr {
+ margin-left: 0;
+ margin-right: 4px;
+ padding-right: 6px;
+ border-right-width: 1px; }
+ .message-list:rtl {
+ margin-right: 0;
+ margin-left: 4px;
+ padding-left: 6px;
+ border-left-width: 1px; }
+ .message-list .message-list-placeholder {
- color: #9a9a9a;
++ color: rgba(255, 255, 255, 0.45); }
+ .message-list .message-list-placeholder > StIcon {
+ icon-size: 96px;
+ margin-bottom: 12px;
+ -st-icon-style: symbolic; }
+
+.message-list-sections {
+ spacing: 12px; }
+ .message-list-sections:ltr {
+ margin-right: 12px; }
+ .message-list-sections:rtl {
+ margin-left: 12px; }
+
+.message-list-section,
+.message-list-section-list {
+ spacing: 12px; }
+
+.message-list-controls {
+ padding: 12px;
+ padding-bottom: 6px;
+ spacing: 6px; }
+ .message-list-controls .dnd-button {
+ border-width: 2px;
+ border-color: transparent;
+ border-radius: 32px;
+ border-style: solid; }
+ .message-list-controls .dnd-button:focus {
+ border-color: st-transparentize(-st-accent-color, 0.4); }
+
+.message {
+ padding: 6px;
+ margin: 0;
+ border-radius: 16px; }
+ .message .message-header {
+ spacing: 6px;
- color: #9a9a9a;
++ color: #9b9b9d;
+ padding: 0 6px; }
+ .message .message-header:ltr {
+ padding-right: 0; }
+ .message .message-header:rtl {
+ padding-left: 0; }
+ .message .message-header .message-source-icon {
+ icon-size: 1.091em;
+ -st-icon-style: symbolic; }
+ .message .message-header .message-header-content {
+ spacing: 6px;
+ min-height: 1.637em;
+ padding-bottom: 6px; }
+ .message .message-header .message-header-content .message-source-title {
+ font-weight: bold; }
+ .message .message-header .message-header-content .event-time {
- background-color: #5b5b5b;
++ color: #9b9b9d;
+ padding-bottom: 0.068em; }
+ .message .message-header .message-header-content .event-time:ltr {
+ text-align: right; }
+ .message .message-header .message-header-content .event-time:rtl {
+ text-align: left; }
+ .message .message-header .message-expand-button,
+ .message .message-header .message-close-button {
+ border-radius: 999px;
+ color: #ffffff; }
+ .message .message-header .message-expand-button {
+ padding: 6px; }
+ .message .message-header .message-close-button {
+ margin: 3px;
+ padding: 4px; }
+ .message .message-box {
+ padding: 6px;
+ margin-top: 0;
+ spacing: 6px; }
+ .message .message-box .message-icon {
+ icon-size: 48px; }
+ .message .message-box .message-icon:ltr {
+ margin-right: 6px; }
+ .message .message-box .message-icon:rtl {
+ margin-left: 6px; }
+ .message .message-box .message-icon.message-themed-icon {
+ border-radius: 999px;
+ background-color: rgba(255, 255, 255, 0.07);
+ icon-size: 1.091em;
+ min-width: 48px;
+ min-height: 48px; }
+ .message .message-box:first-child {
+ margin-top: 12px; }
+ .message .message-box .message-content {
+ spacing: 4px; }
+ .message .message-box .message-content .message-title {
+ font-weight: bold; }
+ .message .message-action-bin {
+ padding: 4px;
+ spacing: 6px; }
+ .message .message-action-bin * {
+ margin: 0 4px; }
+ .message .message-action-bin *:first-child:ltr {
+ margin-left: 0; }
+ .message .message-action-bin *:first-child:rtl {
+ margin-right: 0; }
+ .message .message-action-bin *:last-child:ltr {
+ margin-right: 0; }
+ .message .message-action-bin *:last-child:rtl {
+ margin-left: 0; }
+
+.url-highlighter {
+ link-color: st-lighten(-st-accent-color, 20%); }
+
+/* Media Controls */
+.message-media-control {
+ padding: 0 18px;
+ border-radius: 8px;
+ color: #ffffff;
+ border: 1px solid transparent; }
+ .message-media-control:hover {
- background-color: #606060;
++ background-color: #5b5b62;
+ color: #ffffff; }
+ .message-media-control:active {
- color: #a7a7a7; }
++ background-color: #606067;
+ color: #ffffff; }
+ .message-media-control:insensitive {
- color: #9a9a9a; }
++ color: #a8a8aa; }
+ .message-media-control StIcon {
+ icon-size: 16px; }
+
+.media-message .message-icon {
+ border-radius: 8px !important; }
+ .media-message .message-icon.message-themed-icon {
+ icon-size: 32px !important; }
+
+.candidate-popup-content {
+ padding: 6px;
+ spacing: 6px;
+ border-radius: 12px; }
+
+.candidate-index {
+ padding: 0;
+ padding-right: 6px;
- background-color: #4e4e4e;
++ color: #9b9b9d; }
+
+.candidate-box {
+ padding: 6px 12px 6px 12px;
+ border-radius: 8px; }
+ .candidate-box:selected {
+ background-color: -st-accent-color;
+ color: -st-accent-fg-color; }
+ .candidate-box:hover {
- background-color: #353535;
++ background-color: #4f4f54;
+ color: white; }
+
+.candidate-page-button-box {
+ height: 2em; }
+ .vertical .candidate-page-button-box {
+ padding-top: 12px; }
+ .horizontal .candidate-page-button-box {
+ padding-left: 12px; }
+
+.candidate-page-button {
+ padding: 6px; }
+ .candidate-page-button StIcon {
+ icon-size: 16px; }
+
+.candidate-page-button-previous {
+ border-radius: 8px 0px 0px 8px;
+ border-right-width: 0;
+ box-shadow: none; }
+
+.candidate-page-button-next {
+ border-radius: 0px 8px 8px 0px;
+ box-shadow: none; }
+
+/* Notifications & Message Tray */
+.notification-banner {
+ min-height: 64px;
+ width: 34em;
+ box-shadow: 0 2px 4px 2px rgba(0, 0, 0, 0.2);
+ border-radius: 16px;
+ margin: 4px; }
+
+.notification-buttons-bin {
+ spacing: 0; }
+
+/* Modal Dialogs */
+.modal-dialog {
- color: #f6d32d;
- background-color: rgba(246, 211, 45, 0.1);
++ background-color: #36363a;
+ border-radius: 18px;
+ padding: 24px;
+ spacing: 18px;
+ box-shadow: 0 12px 8px 12px rgba(0, 0, 0, 0.03); }
+ .modal-dialog .modal-dialog-content-box {
+ padding-top: 12px;
+ spacing: 18px;
+ max-width: 28em; }
+ .modal-dialog .modal-dialog-button-box {
+ padding-top: 6px; }
+
+.dialog-list {
+ spacing: 18px; }
+ .dialog-list .dialog-list-title {
+ text-align: center; }
+ .dialog-list .dialog-list-scrollview {
+ max-height: 200px; }
+ .dialog-list .dialog-list-box {
+ spacing: 1em; }
+ .dialog-list .dialog-list-box .dialog-list-item {
+ spacing: 1em; }
+ .dialog-list .dialog-list-box .dialog-list-item .dialog-list-item-title {
+ font-weight: bold; }
+ .dialog-list .dialog-list-box .dialog-list-item .dialog-list-item-description {
+ color: #f2f2f2; }
+
+/* End Session Dialog */
+.end-session-dialog {
+ width: 24em; }
+ .end-session-dialog .end-session-dialog-battery-warning,
+ .end-session-dialog .dialog-list-title {
- color: #f6d32d; }
++ color: #cd9309;
++ background-color: rgba(205, 147, 9, 0.1);
+ padding: 9px;
+ border-radius: 8px;
+ margin: 4px 0; }
+
+/* Message Dialog */
+.message-dialog-content {
+ spacing: 18px; }
+ .message-dialog-content .message-dialog-title {
+ text-align: center; }
+ .message-dialog-content .message-dialog-description {
+ text-align: center; }
+
+/* Run Dialog */
+.run-dialog {
+ width: 24em;
+ padding-bottom: 6px; }
+ .run-dialog .run-dialog-entry {
+ padding: 12px 9px; }
+ .run-dialog .run-dialog-description {
+ color: #cccccc; }
+
+/* Password or Authentication Dialog */
+.prompt-dialog {
+ width: 28em; }
+ .prompt-dialog .prompt-dialog-password-grid {
+ spacing-rows: 8px;
+ spacing-columns: 4px; }
+ .prompt-dialog .prompt-dialog-password-grid .prompt-dialog-password-entry {
+ width: auto; }
+ .prompt-dialog .prompt-dialog-password-grid .prompt-dialog-password-entry:ltr {
+ margin-left: 20px; }
+ .prompt-dialog .prompt-dialog-password-grid .prompt-dialog-password-entry:rtl {
+ margin-right: 20px; }
+ .prompt-dialog .prompt-dialog-password-layout {
+ spacing: 8px; }
+ .prompt-dialog .prompt-dialog-password-entry {
+ width: 20em;
+ padding: 12px 9px; }
+ .prompt-dialog .prompt-dialog-error-label,
+ .prompt-dialog .prompt-dialog-info-label,
+ .prompt-dialog .prompt-dialog-null-label {
+ text-align: center; }
+ .prompt-dialog .prompt-dialog-error-label {
- color: #f6d32d; }
++ color: #cd9309; }
+
+/* Polkit Dialog */
+.polkit-dialog-user-layout {
+ text-align: center;
+ spacing: 8px;
+ margin-bottom: 6px; }
+ .polkit-dialog-user-layout .polkit-dialog-user-root-label {
- background-color: #353535; }
++ color: #cd9309; }
+
+/* Audio selection dialog */
+.audio-device-selection-dialog {
+ min-width: 24em; }
+ .audio-device-selection-dialog .audio-selection-box {
+ spacing: 12px; }
+ .audio-device-selection-dialog .audio-selection-box .audio-selection-device {
+ color: #ffffff;
- box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.5) !important;
- background-color: st-mix(-st-accent-color, rgba(53, 53, 53, 0.25), 5%); }
++ background-color: #2e2e33;
++ background-color: transparent; }
+ .audio-device-selection-dialog .audio-selection-box .audio-selection-device:focus {
+ color: #ffffff;
- background-color: st-mix(-st-accent-color, st-lighten(#353535, 7%), 5%); }
++ box-shadow: inset 0 0 0 2px st-transparentize(st-mix(-st-accent-color, #ffffff, 60%), 0.2) !important;
++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), rgba(46, 46, 51, 0.25), 5%); }
+ .audio-device-selection-dialog .audio-selection-box .audio-selection-device:focus:hover {
- background-color: st-lighten(#353535, 7%); }
++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-lighten(#2e2e33, 7%), 5%); }
+ .audio-device-selection-dialog .audio-selection-box .audio-selection-device:hover {
+ color: #ffffff;
- background-color: st-lighten(#353535, 9%); }
++ background-color: st-lighten(#2e2e33, 7%); }
+ .audio-device-selection-dialog .audio-selection-box .audio-selection-device:active {
+ color: #ffffff;
- background-color: st-lighten(st-lighten(#353535, 9%), 7%); }
++ background-color: st-lighten(#2e2e33, 9%); }
+ .audio-device-selection-dialog .audio-selection-box .audio-selection-device:active:hover {
- background-color: st-mix(-st-accent-color, st-lighten(#353535, 9%), 5%); }
++ background-color: st-lighten(st-lighten(#2e2e33, 9%), 7%); }
+ .audio-device-selection-dialog .audio-selection-box .audio-selection-device:active:focus {
- background-color: st-lighten(#353535, 8%); }
++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-lighten(#2e2e33, 9%), 5%); }
+ .audio-device-selection-dialog .audio-selection-box .audio-selection-device:highlighted, .audio-device-selection-dialog .audio-selection-box .audio-selection-device:selected, .audio-device-selection-dialog .audio-selection-box .audio-selection-device:checked {
+ color: #ffffff;
- background-color: st-lighten(st-lighten(#353535, 8%), 7%); }
++ background-color: st-lighten(#2e2e33, 8%); }
+ .audio-device-selection-dialog .audio-selection-box .audio-selection-device:highlighted:hover, .audio-device-selection-dialog .audio-selection-box .audio-selection-device:selected:hover, .audio-device-selection-dialog .audio-selection-box .audio-selection-device:checked:hover {
- background-color: st-lighten(st-lighten(#353535, 8%), 9%); }
++ background-color: st-lighten(st-lighten(#2e2e33, 8%), 7%); }
+ .audio-device-selection-dialog .audio-selection-box .audio-selection-device:highlighted:active, .audio-device-selection-dialog .audio-selection-box .audio-selection-device:selected:active, .audio-device-selection-dialog .audio-selection-box .audio-selection-device:checked:active {
- background-color: #353535; }
++ background-color: st-lighten(st-lighten(#2e2e33, 8%), 9%); }
+ .audio-device-selection-dialog .audio-selection-box .audio-selection-device:insensitive {
+ color: st-transparentize(#ffffff, 0.5);
- .osd-monitor-label {
++ background-color: #2e2e33; }
+ .audio-device-selection-dialog .audio-selection-box .audio-selection-device:drop {
+ background-color: st-transparentize(-st-accent-color, 0.8);
+ box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.2); }
+ .audio-device-selection-dialog .audio-selection-box .audio-selection-device .audio-selection-device-box {
+ padding: 12px;
+ spacing: 12px; }
+ .audio-device-selection-dialog .audio-selection-box .audio-selection-device .audio-selection-device-icon {
+ icon-size: 64px; }
+
+/* Welcome dialog */
+.welcome-dialog-image {
+ background-image: url("resource:///org/gnome/shell/theme/gnome-shell-start.svg");
+ background-size: contain;
+ /* Reasonable maximum dimensions */
+ height: 300px;
+ width: 300px; }
+
+/* Access portal dialog */
+.access-dialog {
+ text-align: center; }
+
+/* OSD */
+.osd-window {
+ text-align: center;
+ font-weight: bold;
+ spacing: 12px;
+ padding: 12px 18px;
+ margin-bottom: 4em; }
+ .osd-window > * {
+ spacing: 8px; }
+ .osd-window StIcon {
+ icon-size: 32px; }
+ .osd-window StLabel:ltr {
+ margin-right: 6px; }
+ .osd-window StLabel:rtl {
+ margin-left: 6px; }
+ .osd-window .level {
+ margin-bottom: 4px;
+ min-width: 160px;
+ -barlevel-height: 6px;
+ -barlevel-background-color: rgba(255, 255, 255, 0.1);
+ -barlevel-active-background-color: #ffffff;
+ -barlevel-overdrive-color: #c01c28;
+ -barlevel-overdrive-separator-width: 3px; }
+ .osd-window .level:first-child {
+ margin-bottom: 0; }
+ .osd-window .level:ltr {
+ margin-right: 6px; }
+ .osd-window .level:rtl {
+ margin-left: 6px; }
+
- background-color: #353535; }
++.osd-monitor-label, .osd-break-countdown-label {
+ background-color: -st-accent-color;
+ color: -st-accent-fg-color;
+ border-radius: 16px;
+ font-size: 3em;
+ font-weight: bold;
+ font-feature-settings: "tnum";
+ margin: 12px;
+ padding: 12px;
+ text-align: center;
+ min-width: 1.5em; }
+
+/* Pad OSD */
+.pad-osd-window {
+ padding: 32px;
+ background-color: rgba(0, 0, 0, 0.8); }
+ .pad-osd-window .pad-osd-title-box {
+ spacing: 12px; }
+ .pad-osd-window .pad-osd-title-menu-box {
+ spacing: 6px; }
+
+.combo-box-label {
+ width: 15em; }
+
+/* App Switcher */
+.switcher-popup {
+ padding: 0;
+ spacing: 24px; }
+
+.switcher-list {
+ padding: 12px;
+ border-radius: 28px;
+ box-shadow: 0 8px 8px 0 rgba(0, 0, 0, 0.2); }
+ .switcher-list .switcher-list-item-container {
+ spacing: 12px; }
+ .switcher-list .item-box {
+ color: #ffffff;
- box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.5) !important;
- background-color: st-mix(-st-accent-color, rgba(53, 53, 53, 0.25), 5%); }
++ background-color: #2e2e33;
++ background-color: transparent; }
+ .switcher-list .item-box:focus {
+ color: #ffffff;
- background-color: st-mix(-st-accent-color, st-lighten(#353535, 7%), 5%); }
++ box-shadow: inset 0 0 0 2px st-transparentize(st-mix(-st-accent-color, #ffffff, 60%), 0.2) !important;
++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), rgba(46, 46, 51, 0.25), 5%); }
+ .switcher-list .item-box:focus:hover {
- background-color: st-lighten(#353535, 7%); }
++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-lighten(#2e2e33, 7%), 5%); }
+ .switcher-list .item-box:hover {
+ color: #ffffff;
- background-color: st-lighten(#353535, 9%); }
++ background-color: st-lighten(#2e2e33, 7%); }
+ .switcher-list .item-box:active {
+ color: #ffffff;
- background-color: st-lighten(st-lighten(#353535, 9%), 7%); }
++ background-color: st-lighten(#2e2e33, 9%); }
+ .switcher-list .item-box:active:hover {
- background-color: st-mix(-st-accent-color, st-lighten(#353535, 9%), 5%); }
++ background-color: st-lighten(st-lighten(#2e2e33, 9%), 7%); }
+ .switcher-list .item-box:active:focus {
- background-color: st-lighten(#353535, 8%); }
++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-lighten(#2e2e33, 9%), 5%); }
+ .switcher-list .item-box:highlighted, .switcher-list .item-box:selected, .switcher-list .item-box:checked {
+ color: #ffffff;
- background-color: st-lighten(st-lighten(#353535, 8%), 7%); }
++ background-color: st-lighten(#2e2e33, 8%); }
+ .switcher-list .item-box:highlighted:hover, .switcher-list .item-box:selected:hover, .switcher-list .item-box:checked:hover {
- background-color: st-lighten(st-lighten(#353535, 8%), 9%); }
++ background-color: st-lighten(st-lighten(#2e2e33, 8%), 7%); }
+ .switcher-list .item-box:highlighted:active, .switcher-list .item-box:selected:active, .switcher-list .item-box:checked:active {
- background-color: #353535; }
++ background-color: st-lighten(st-lighten(#2e2e33, 8%), 9%); }
+ .switcher-list .item-box:insensitive {
+ color: st-transparentize(#ffffff, 0.5);
- background-color: #4e4e4e; }
++ background-color: #2e2e33; }
+ .switcher-list .item-box:drop {
+ background-color: st-transparentize(-st-accent-color, 0.8);
+ box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.2); }
+ .switcher-list .item-box:hover {
+ background: none; }
+ .switcher-list .item-box:selected {
+ background-color: rgba(255, 255, 255, 0.2); }
+ .switcher-list .separator {
+ width: 1px;
+ background: rgba(255, 255, 255, 0.1); }
+ .switcher-list .thumbnail-box {
+ padding: 2px;
+ spacing: 6px; }
+ .switcher-list .thumbnail {
+ width: 256px;
+ border-radius: 8px; }
+
+.switcher-arrow {
+ border-color: rgba(255, 255, 255, 0.8);
+ color: rgba(255, 255, 255, 0.8); }
+ .switcher-arrow:highlighted {
+ border-color: #ffffff;
+ color: #ffffff; }
+
+.input-source-switcher-symbol {
+ font-size: 34pt;
+ width: 96px;
+ height: 96px; }
+
+.cycler-highlight {
+ border: 5px solid -st-accent-color; }
+
+/* Workspace Switcher */
+.workspace-switcher {
+ margin-bottom: 4em;
+ spacing: 12px;
+ padding: 12px 18px; }
+
+.ws-switcher-indicator {
+ background-color: rgba(255, 255, 255, 0.5);
+ padding: 2.6666666667px;
+ margin: 13.3333333333px;
+ border-radius: 32px; }
+ .ws-switcher-indicator:active {
+ background-color: #ffffff;
+ padding: 5.3333333333px;
+ margin: 10.6666666667px; }
+
+.screenshot-ui-panel {
+ border-radius: 32px;
+ padding: 18px;
+ padding-bottom: 12px;
+ margin-bottom: 4em;
+ spacing: 12px; }
+
+.screenshot-ui-close-button {
+ padding: 6px !important;
+ margin-top: 12px;
+ box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.2); }
+ .screenshot-ui-close-button.left {
+ margin-left: 12px; }
+ .screenshot-ui-close-button.right {
+ margin-right: 12px; }
+
+.screenshot-ui-type-button {
+ min-width: 48px;
+ padding: 12px 18px;
+ border-radius: 14px; }
+ .screenshot-ui-type-button .icon-label-button-container {
+ spacing: 0.409em; }
+ .screenshot-ui-type-button .icon-label-button-container > StIcon {
+ icon-size: 32px; }
+
+.screenshot-ui-capture-button {
+ width: 32px;
+ height: 32px;
+ border-radius: 999px;
+ border: 4px #ffffff;
+ padding: 4px; }
+ .screenshot-ui-capture-button .screenshot-ui-capture-button-circle {
+ background-color: #ffffff;
+ transition-duration: 200ms;
+ border-radius: 999px; }
+ .screenshot-ui-capture-button .screenshot-ui-capture-button-circle:hover, .screenshot-ui-capture-button .screenshot-ui-capture-button-circle:focus {
- color: #353535; }
++ background-color: #4f4f54; }
+ .screenshot-ui-capture-button:hover .screenshot-ui-capture-button-circle, .screenshot-ui-capture-button:focus .screenshot-ui-capture-button-circle {
+ background-color: #cccccc; }
+ .screenshot-ui-capture-button:active .screenshot-ui-capture-button-circle {
+ background-color: gray; }
+ .screenshot-ui-capture-button:cast .screenshot-ui-capture-button-circle {
+ background-color: #c01c28; }
+ .screenshot-ui-capture-button:cast:hover .screenshot-ui-capture-button-circle, .screenshot-ui-capture-button:cast:focus .screenshot-ui-capture-button-circle {
+ background-color: #d61f2d; }
+ .screenshot-ui-capture-button:cast:active .screenshot-ui-capture-button-circle {
+ background-color: #a11722; }
+
+.screenshot-ui-shot-cast-container {
+ background-color: rgba(255, 255, 255, 0.1);
+ border-radius: 999px;
+ padding: 3px;
+ spacing: 3px; }
+
+.screenshot-ui-shot-cast-button {
+ padding: 6px 12px;
+ background-color: transparent;
+ border-radius: 999px; }
+ .screenshot-ui-shot-cast-button > StIcon {
+ icon-size: 16px; }
+ .screenshot-ui-shot-cast-button:hover, .screenshot-ui-shot-cast-button:focus {
+ background-color: rgba(255, 255, 255, 0.2); }
+ .screenshot-ui-shot-cast-button:active {
+ background-color: rgba(255, 255, 255, 0.5); }
+ .screenshot-ui-shot-cast-button:checked {
+ background-color: #ffffff;
- background-color: #282828; }
++ color: #2e2e33; }
+ .screenshot-ui-shot-cast-button:insensitive {
+ color: rgba(255, 255, 255, 0.5); }
+
+.screenshot-ui-area-indicator-shade {
+ background-color: rgba(0, 0, 0, 0.3); }
+
+.screenshot-ui-area-selector .screenshot-ui-area-indicator-shade {
+ background-color: rgba(0, 0, 0, 0.5); }
+
+.screenshot-ui-area-selector .screenshot-ui-area-indicator-selection {
+ border: 2px white; }
+
+.screenshot-ui-area-selector-handle {
+ border-radius: 999px;
+ background-color: white;
+ box-shadow: 0 1px 3px 2px rgba(0, 0, 0, 0.2);
+ width: 24px;
+ height: 24px; }
+
+.screenshot-ui-window-selector {
- color: whitesmoke;
++ background-color: #222226; }
+ .screenshot-ui-window-selector .screenshot-ui-window-selector-window-container {
+ margin: 100px; }
+ .screenshot-ui-window-selector:primary-monitor .screenshot-ui-window-selector-window-container {
+ margin-bottom: 200px; }
+
+.screenshot-ui-window-selector-window-border {
+ transition-duration: 200ms;
+ border-radius: 16px;
+ border: 6px transparent; }
+
+.screenshot-ui-window-selector-check {
+ transition-duration: 200ms;
+ color: transparent;
+ border-radius: 999px;
+ border-width: 12px;
+ icon-size: 24px; }
+
+.screenshot-ui-window-selector-window:hover .screenshot-ui-window-selector-window-border {
+ border-color: st-darken(-st-accent-color, 15%); }
+
+.screenshot-ui-window-selector-window:checked .screenshot-ui-window-selector-window-border {
+ border-color: -st-accent-color;
+ background-color: st-transparentize(-st-accent-color, 0.8); }
+
+.screenshot-ui-window-selector-window:checked .screenshot-ui-window-selector-check {
+ color: -st-accent-fg-color;
+ background-color: -st-accent-color; }
+
+.screenshot-ui-screen-selector {
+ transition-duration: 200ms;
+ background-color: rgba(0, 0, 0, 0.5); }
+ .screenshot-ui-screen-selector:hover {
+ background-color: rgba(0, 0, 0, 0.3); }
+ .screenshot-ui-screen-selector:active {
+ background-color: rgba(0, 0, 0, 0.7); }
+ .screenshot-ui-screen-selector:checked {
+ background-color: transparent;
+ border: 2px white; }
+
+.screenshot-ui-tooltip {
+ text-align: center;
+ -y-offset: 24px; }
+
+/* Top Bar */
+#panel {
+ background-color: #000000;
+ font-weight: bold;
+ height: 2.2em;
+ transition-duration: 250ms; }
+ #panel .panel-button {
+ transition-duration: 150ms;
+ border: 3px solid transparent;
+ background-color: transparent;
+ border-radius: 999px;
+ font-weight: bold;
+ color: #ffffff;
+ box-shadow: inset 0 0 0 100px transparent;
+ -natural-hpadding: 12px;
+ -minimum-hpadding: 6px; }
+ #panel .panel-button:focus, #panel .panel-button:hover {
+ box-shadow: inset 0 0 0 100px rgba(255, 255, 255, 0.17); }
+ #panel .panel-button:active, #panel .panel-button:checked {
+ box-shadow: inset 0 0 0 100px rgba(255, 255, 255, 0.28); }
+ #panel .panel-button:active:hover, #panel .panel-button:checked:hover {
+ box-shadow: inset 0 0 0 100px rgba(255, 255, 255, 0.32); }
+ #panel .panel-button .system-status-icon {
+ icon-size: 1.091em;
+ padding: 0 6px;
+ margin: 0 4px; }
+ #panel .panel-button .app-menu-icon {
+ -st-icon-style: symbolic; }
+ #panel .panel-button .panel-status-menu-box,
+ #panel .panel-button .panel-status-indicators-box {
+ spacing: 4px; }
+ #panel .panel-button .panel-status-menu-box > .system-status-icon,
+ #panel .panel-button .panel-status-indicators-box > .system-status-icon {
+ padding: 0; }
+ #panel .panel-button#panelActivities StBoxLayout {
+ padding: 0 0.2045em;
+ spacing: 5px; }
+ #panel .panel-button#panelActivities .workspace-dot {
+ border-radius: 999px;
+ min-width: 0.5455em;
+ min-height: 0.5455em;
+ background-color: #ffffff; }
+ #panel .panel-button.screen-recording-indicator StBoxLayout, #panel .panel-button.screen-sharing-indicator StBoxLayout {
+ spacing: 0.409em; }
+ #panel .panel-button.screen-recording-indicator StIcon, #panel .panel-button.screen-sharing-indicator StIcon {
+ icon-size: 1.091em; }
+ #panel .panel-button.screen-recording-indicator {
+ transition-duration: 150ms;
+ border: 3px solid transparent;
+ background-color: transparent;
+ border-radius: 999px;
+ font-weight: bold;
- color: whitesmoke;
++ color: #fafafb;
+ box-shadow: inset 0 0 0 100px #c01c28; }
+ #panel .panel-button.screen-recording-indicator:focus, #panel .panel-button.screen-recording-indicator:hover {
+ box-shadow: inset 0 0 0 100px #d61f2d; }
+ #panel .panel-button.screen-recording-indicator:active, #panel .panel-button.screen-recording-indicator:checked {
+ box-shadow: inset 0 0 0 100px #e02a37; }
+ #panel .panel-button.screen-recording-indicator:active:hover, #panel .panel-button.screen-recording-indicator:checked:hover {
+ box-shadow: inset 0 0 0 100px #e13340; }
+ #panel .panel-button.screen-sharing-indicator {
+ transition-duration: 150ms;
+ border: 3px solid transparent;
+ background-color: transparent;
+ border-radius: 999px;
+ font-weight: bold;
- color: whitesmoke;
++ color: #fafafb;
+ box-shadow: inset 0 0 0 100px #ff7800; }
+ #panel .panel-button.screen-sharing-indicator:focus, #panel .panel-button.screen-sharing-indicator:hover {
+ box-shadow: inset 0 0 0 100px #ff861a; }
+ #panel .panel-button.screen-sharing-indicator:active, #panel .panel-button.screen-sharing-indicator:checked {
+ box-shadow: inset 0 0 0 100px #ff902e; }
+ #panel .panel-button.screen-sharing-indicator:active:hover, #panel .panel-button.screen-sharing-indicator:checked:hover {
+ box-shadow: inset 0 0 0 100px #ff9638; }
+ #panel .panel-button.clock-display {
+ transition-duration: 150ms;
+ border: 3px solid transparent;
+ background-color: transparent;
+ border-radius: 999px;
+ font-weight: bold;
+ color: #ffffff;
+ box-shadow: inset 0 0 0 100px transparent;
+ background: none !important;
+ box-shadow: none !important;
+ border: none !important; }
+ #panel .panel-button.clock-display:focus, #panel .panel-button.clock-display:hover {
+ box-shadow: inset 0 0 0 100px rgba(255, 255, 255, 0.17); }
+ #panel .panel-button.clock-display:active, #panel .panel-button.clock-display:checked {
+ box-shadow: inset 0 0 0 100px rgba(255, 255, 255, 0.28); }
+ #panel .panel-button.clock-display:active:hover, #panel .panel-button.clock-display:checked:hover {
+ box-shadow: inset 0 0 0 100px rgba(255, 255, 255, 0.32); }
+ #panel .panel-button.clock-display .clock {
+ transition-duration: 150ms;
+ border: 3px solid transparent;
+ border-radius: 999px; }
+ #panel .panel-button.clock-display:focus .clock, #panel .panel-button.clock-display:hover .clock {
+ box-shadow: inset 0 0 0 100px rgba(255, 255, 255, 0.17); }
+ #panel .panel-button.clock-display:active .clock, #panel .panel-button.clock-display:checked .clock {
+ box-shadow: inset 0 0 0 100px rgba(255, 255, 255, 0.28); }
+ #panel .panel-button.clock-display:active .clock:hover, #panel .panel-button.clock-display:checked .clock:hover {
+ box-shadow: inset 0 0 0 100px rgba(255, 255, 255, 0.32); }
+ #panel .panel-button.clock-display .messages-indicator {
+ icon-size: 1.091em; }
+ #panel:overview, #panel.unlock-screen, #panel.login-screen {
+ background-color: transparent; }
+ #panel:overview .panel-button.screen-recording-indicator, #panel.unlock-screen .panel-button.screen-recording-indicator, #panel.login-screen .panel-button.screen-recording-indicator {
+ transition-duration: 150ms;
+ border: 3px solid transparent;
+ background-color: transparent;
+ border-radius: 999px;
+ font-weight: bold;
- color: whitesmoke;
++ color: #fafafb;
+ box-shadow: inset 0 0 0 100px #c01c28; }
+ #panel:overview .panel-button.screen-recording-indicator:focus, #panel:overview .panel-button.screen-recording-indicator:hover, #panel.unlock-screen .panel-button.screen-recording-indicator:focus, #panel.unlock-screen .panel-button.screen-recording-indicator:hover, #panel.login-screen .panel-button.screen-recording-indicator:focus, #panel.login-screen .panel-button.screen-recording-indicator:hover {
+ box-shadow: inset 0 0 0 100px #d61f2d; }
+ #panel:overview .panel-button.screen-recording-indicator:active, #panel:overview .panel-button.screen-recording-indicator:checked, #panel.unlock-screen .panel-button.screen-recording-indicator:active, #panel.unlock-screen .panel-button.screen-recording-indicator:checked, #panel.login-screen .panel-button.screen-recording-indicator:active, #panel.login-screen .panel-button.screen-recording-indicator:checked {
+ box-shadow: inset 0 0 0 100px #e02a37; }
+ #panel:overview .panel-button.screen-recording-indicator:active:hover, #panel:overview .panel-button.screen-recording-indicator:checked:hover, #panel.unlock-screen .panel-button.screen-recording-indicator:active:hover, #panel.unlock-screen .panel-button.screen-recording-indicator:checked:hover, #panel.login-screen .panel-button.screen-recording-indicator:active:hover, #panel.login-screen .panel-button.screen-recording-indicator:checked:hover {
+ box-shadow: inset 0 0 0 100px #e13340; }
+ #panel:overview .panel-button.screen-sharing-indicator, #panel.unlock-screen .panel-button.screen-sharing-indicator, #panel.login-screen .panel-button.screen-sharing-indicator {
+ transition-duration: 150ms;
+ border: 3px solid transparent;
+ background-color: transparent;
+ border-radius: 999px;
+ font-weight: bold;
- color: whitesmoke;
++ color: #fafafb;
+ box-shadow: inset 0 0 0 100px #ff7800; }
+ #panel:overview .panel-button.screen-sharing-indicator:focus, #panel:overview .panel-button.screen-sharing-indicator:hover, #panel.unlock-screen .panel-button.screen-sharing-indicator:focus, #panel.unlock-screen .panel-button.screen-sharing-indicator:hover, #panel.login-screen .panel-button.screen-sharing-indicator:focus, #panel.login-screen .panel-button.screen-sharing-indicator:hover {
+ box-shadow: inset 0 0 0 100px #ff861a; }
+ #panel:overview .panel-button.screen-sharing-indicator:active, #panel:overview .panel-button.screen-sharing-indicator:checked, #panel.unlock-screen .panel-button.screen-sharing-indicator:active, #panel.unlock-screen .panel-button.screen-sharing-indicator:checked, #panel.login-screen .panel-button.screen-sharing-indicator:active, #panel.login-screen .panel-button.screen-sharing-indicator:checked {
+ box-shadow: inset 0 0 0 100px #ff902e; }
+ #panel:overview .panel-button.screen-sharing-indicator:active:hover, #panel:overview .panel-button.screen-sharing-indicator:checked:hover, #panel.unlock-screen .panel-button.screen-sharing-indicator:active:hover, #panel.unlock-screen .panel-button.screen-sharing-indicator:checked:hover, #panel.login-screen .panel-button.screen-sharing-indicator:active:hover, #panel.login-screen .panel-button.screen-sharing-indicator:checked:hover {
+ box-shadow: inset 0 0 0 100px #ff9638; }
+ #panel.unlock-screen .panel-button, #panel.login-screen .panel-button {
+ transition-duration: 150ms;
+ border: 3px solid transparent;
+ background-color: transparent;
+ border-radius: 999px;
+ font-weight: bold;
+ color: #ffffff;
+ box-shadow: inset 0 0 0 100px transparent; }
+ #panel.unlock-screen .panel-button:focus, #panel.unlock-screen .panel-button:hover, #panel.login-screen .panel-button:focus, #panel.login-screen .panel-button:hover {
+ box-shadow: inset 0 0 0 100px rgba(255, 255, 255, 0.17); }
+ #panel.unlock-screen .panel-button:active, #panel.unlock-screen .panel-button:checked, #panel.login-screen .panel-button:active, #panel.login-screen .panel-button:checked {
+ box-shadow: inset 0 0 0 100px rgba(255, 255, 255, 0.28); }
+ #panel.unlock-screen .panel-button:active:hover, #panel.unlock-screen .panel-button:checked:hover, #panel.login-screen .panel-button:active:hover, #panel.login-screen .panel-button:checked:hover {
+ box-shadow: inset 0 0 0 100px rgba(255, 255, 255, 0.32); }
+ #panel.unlock-screen .panel-button.clock-display, #panel.login-screen .panel-button.clock-display {
+ transition-duration: 150ms;
+ border: 3px solid transparent;
+ background-color: transparent;
+ border-radius: 999px;
+ font-weight: bold;
+ color: #ffffff;
+ box-shadow: inset 0 0 0 100px transparent;
+ background: none !important;
+ box-shadow: none !important;
+ border: none !important; }
+ #panel.unlock-screen .panel-button.clock-display:focus, #panel.unlock-screen .panel-button.clock-display:hover, #panel.login-screen .panel-button.clock-display:focus, #panel.login-screen .panel-button.clock-display:hover {
+ box-shadow: inset 0 0 0 100px rgba(255, 255, 255, 0.17); }
+ #panel.unlock-screen .panel-button.clock-display:active, #panel.unlock-screen .panel-button.clock-display:checked, #panel.login-screen .panel-button.clock-display:active, #panel.login-screen .panel-button.clock-display:checked {
+ box-shadow: inset 0 0 0 100px rgba(255, 255, 255, 0.28); }
+ #panel.unlock-screen .panel-button.clock-display:active:hover, #panel.unlock-screen .panel-button.clock-display:checked:hover, #panel.login-screen .panel-button.clock-display:active:hover, #panel.login-screen .panel-button.clock-display:checked:hover {
+ box-shadow: inset 0 0 0 100px rgba(255, 255, 255, 0.32); }
+ #panel.unlock-screen .panel-button.clock-display .clock, #panel.login-screen .panel-button.clock-display .clock {
+ transition-duration: 150ms;
+ border: 3px solid transparent;
+ border-radius: 999px; }
+ #panel.unlock-screen .panel-button.clock-display:focus .clock, #panel.unlock-screen .panel-button.clock-display:hover .clock, #panel.login-screen .panel-button.clock-display:focus .clock, #panel.login-screen .panel-button.clock-display:hover .clock {
+ box-shadow: inset 0 0 0 100px rgba(255, 255, 255, 0.17); }
+ #panel.unlock-screen .panel-button.clock-display:active .clock, #panel.unlock-screen .panel-button.clock-display:checked .clock, #panel.login-screen .panel-button.clock-display:active .clock, #panel.login-screen .panel-button.clock-display:checked .clock {
+ box-shadow: inset 0 0 0 100px rgba(255, 255, 255, 0.28); }
+ #panel.unlock-screen .panel-button.clock-display:active .clock:hover, #panel.unlock-screen .panel-button.clock-display:checked .clock:hover, #panel.login-screen .panel-button.clock-display:active .clock:hover, #panel.login-screen .panel-button.clock-display:checked .clock:hover {
+ box-shadow: inset 0 0 0 100px rgba(255, 255, 255, 0.32); }
+ #panel:overview .panel-button {
+ transition-duration: 150ms;
+ border: 3px solid transparent;
+ background-color: transparent;
+ border-radius: 999px;
+ font-weight: bold;
- box-shadow: inset 0 0 0 100px rgba(245, 245, 245, 0.17); }
++ color: #fafafb;
+ box-shadow: inset 0 0 0 100px transparent; }
+ #panel:overview .panel-button:focus, #panel:overview .panel-button:hover {
- box-shadow: inset 0 0 0 100px rgba(245, 245, 245, 0.28); }
++ box-shadow: inset 0 0 0 100px rgba(250, 250, 251, 0.17); }
+ #panel:overview .panel-button:active, #panel:overview .panel-button:checked {
- box-shadow: inset 0 0 0 100px rgba(245, 245, 245, 0.32); }
++ box-shadow: inset 0 0 0 100px rgba(250, 250, 251, 0.28); }
+ #panel:overview .panel-button:active:hover, #panel:overview .panel-button:checked:hover {
- background-color: whitesmoke; }
++ box-shadow: inset 0 0 0 100px rgba(250, 250, 251, 0.32); }
+ #panel:overview .panel-button#panelActivities .workspace-dot {
- color: whitesmoke;
++ background-color: #fafafb; }
+ #panel:overview .panel-button.clock-display {
+ transition-duration: 150ms;
+ border: 3px solid transparent;
+ background-color: transparent;
+ border-radius: 999px;
+ font-weight: bold;
- box-shadow: inset 0 0 0 100px rgba(245, 245, 245, 0.17); }
++ color: #fafafb;
+ box-shadow: inset 0 0 0 100px transparent;
+ background: none !important;
+ box-shadow: none !important;
+ border: none !important; }
+ #panel:overview .panel-button.clock-display:focus, #panel:overview .panel-button.clock-display:hover {
- box-shadow: inset 0 0 0 100px rgba(245, 245, 245, 0.28); }
++ box-shadow: inset 0 0 0 100px rgba(250, 250, 251, 0.17); }
+ #panel:overview .panel-button.clock-display:active, #panel:overview .panel-button.clock-display:checked {
- box-shadow: inset 0 0 0 100px rgba(245, 245, 245, 0.32); }
++ box-shadow: inset 0 0 0 100px rgba(250, 250, 251, 0.28); }
+ #panel:overview .panel-button.clock-display:active:hover, #panel:overview .panel-button.clock-display:checked:hover {
- box-shadow: inset 0 0 0 100px rgba(245, 245, 245, 0.17); }
++ box-shadow: inset 0 0 0 100px rgba(250, 250, 251, 0.32); }
+ #panel:overview .panel-button.clock-display .clock {
+ transition-duration: 150ms;
+ border: 3px solid transparent;
+ border-radius: 999px; }
+ #panel:overview .panel-button.clock-display:focus .clock, #panel:overview .panel-button.clock-display:hover .clock {
- box-shadow: inset 0 0 0 100px rgba(245, 245, 245, 0.28); }
++ box-shadow: inset 0 0 0 100px rgba(250, 250, 251, 0.17); }
+ #panel:overview .panel-button.clock-display:active .clock, #panel:overview .panel-button.clock-display:checked .clock {
- box-shadow: inset 0 0 0 100px rgba(245, 245, 245, 0.32); }
++ box-shadow: inset 0 0 0 100px rgba(250, 250, 251, 0.28); }
+ #panel:overview .panel-button.clock-display:active .clock:hover, #panel:overview .panel-button.clock-display:checked .clock:hover {
- .quick-toggle, .quick-menu-toggle {
++ box-shadow: inset 0 0 0 100px rgba(250, 250, 251, 0.32); }
+ #panel .panel-status-indicators-box,
+ #panel .panel-status-menu-box {
+ spacing: 2px; }
+ #panel .power-status.panel-status-indicators-box {
+ spacing: 0; }
+ #panel .privacy-indicator {
+ color: #ff7800; }
+
+#appMenu {
+ spacing: 0.409em; }
+ #appMenu .label-shadow {
+ color: transparent; }
+
+#appMenu .panel-status-menu-box {
+ padding: 0 0.409em;
+ spacing: 0.409em; }
+
+.clock-display-box {
+ spacing: 2px; }
+ .clock-display-box .clock {
+ padding-left: 0.818em;
+ padding-right: 0.818em; }
+
+/* Activities Ripple */
+.ripple-box {
+ background-color: rgba(255, 255, 255, 0.2);
+ box-shadow: 0 0 2px 2px rgba(255, 255, 255, 0.2);
+ width: 52px;
+ height: 52px;
+ border-radius: 0 0 52px 0; }
+ .ripple-box:rtl {
+ border-radius: 0 0 0 52px; }
+
+.quick-settings {
+ padding: 18px;
+ border-radius: 36px; }
+ .quick-settings .icon-button, .quick-settings .login-dialog-button.cancel-button, .quick-settings .login-dialog-button.switch-user-button, .quick-settings .login-dialog-button.login-dialog-session-list-button, .quick-settings .calendar .calendar-month-header .pager-button, .calendar .calendar-month-header .quick-settings .pager-button, .quick-settings .message .message-header .message-expand-button, .message .message-header .quick-settings .message-expand-button,
+ .quick-settings .message .message-header .message-close-button,
+ .message .message-header .quick-settings .message-close-button, .quick-settings .screenshot-ui-show-pointer-button, .quick-settings .button {
+ padding: 10.5px; }
+
+.quick-settings-grid {
+ spacing-rows: 12px;
+ spacing-columns: 12px; }
+
- min-height: 3.273em;
- border: none; }
++.quick-toggle, .quick-toggle-has-menu {
+ border-radius: 999px;
+ min-width: 12em;
+ max-width: 12em;
- background-color: none;
++ min-height: 3.273em; }
+
+.quick-toggle {
- .quick-toggle .quick-toggle-title {
- font-weight: bold; }
- .quick-toggle StBoxLayout > .quick-toggle-subtitle {
+ /* Move padding into the box; this is to allow menu arrows
+ to extend to the border */ }
+ .quick-toggle > StBoxLayout {
+ spacing: 9px; }
+ .quick-toggle.button {
+ padding: 0; }
+ .quick-toggle > StBoxLayout {
+ padding: 0 12px; }
+ .quick-toggle:ltr > StBoxLayout {
+ padding-left: 15px; }
+ .quick-toggle:rtl > StBoxLayout {
+ padding-right: 15px; }
- .quick-menu-toggle .quick-toggle {
++ .quick-toggle .quick-toggle-subtitle {
+ font-weight: normal; }
+ .quick-toggle .quick-toggle-icon {
+ icon-size: 1.091em; }
+
- .quick-menu-toggle .quick-toggle:ltr {
++.quick-toggle-has-menu .quick-toggle {
+ min-width: auto;
+ max-width: auto; }
- .quick-menu-toggle .quick-toggle:ltr > StBoxLayout {
- padding-right: 0.6135em; }
- .quick-menu-toggle .quick-toggle:rtl {
++ .quick-toggle-has-menu .quick-toggle:ltr {
+ border-radius: 999px 0 0 999px; }
- .quick-menu-toggle .quick-toggle:rtr > StBoxLayout {
- padding-left: 0.6135em; }
- .quick-menu-toggle .quick-toggle:ltr:last-child {
++ .quick-toggle-has-menu .quick-toggle:ltr > StBoxLayout {
++ padding-right: 0.6135em; }
++ .quick-toggle-has-menu .quick-toggle:rtl {
+ border-radius: 0 999px 999px 0; }
- .quick-menu-toggle .quick-toggle:rtl:last-child {
++ .quick-toggle-has-menu .quick-toggle:rtl > StBoxLayout {
++ padding-left: 0.6135em; }
++ .quick-toggle-has-menu .quick-toggle:ltr:last-child {
+ border-radius: 999px; }
- .quick-menu-toggle .quick-toggle-arrow {
- padding: 0.409em 0.71575em;
- border-width: 0;
- border-color: rgba(255, 255, 255, 0.25); }
- .quick-menu-toggle .quick-toggle-arrow:checked {
- border-color: st-lighten(-st-accent-color, 15%); }
- .quick-menu-toggle .quick-toggle-arrow:ltr {
- border-radius: 0 999px 999px 0;
- border-left-width: 1px; }
- .quick-menu-toggle .quick-toggle-arrow:rtl {
- border-radius: 999px 0 0 999px;
- border-right-width: 1px; }
++ .quick-toggle-has-menu .quick-toggle:rtl:last-child {
+ border-radius: 999px; }
+
- box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.5) !important;
- background-color: st-mix(-st-accent-color, st-mix(#ffffff, #353535, 9%), 5%); }
++.quick-toggle-has-menu .quick-toggle-menu-button {
++ padding: 0.409em 0.71575em; }
++ .quick-toggle-has-menu .quick-toggle-menu-button:ltr {
++ border-radius: 0 999px 999px 0; }
++ .quick-toggle-has-menu .quick-toggle-menu-button:rtl {
++ border-radius: 999px 0 0 999px; }
++
++.quick-toggle-has-menu .quick-toggle-separator {
++ width: 1px; }
++
++.quick-toggle-has-menu .quick-toggle-menu-button {
++ color: #ffffff;
++ background-color: st-mix(#ffffff, #4a4a4f, 9%); }
++ .quick-toggle-has-menu .quick-toggle-menu-button:focus {
++ color: #ffffff;
++ box-shadow: inset 0 0 0 2px st-transparentize(st-mix(-st-accent-color, #ffffff, 60%), 0.2) !important;
++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(#ffffff, #4a4a4f, 9%), 5%); }
++ .quick-toggle-has-menu .quick-toggle-menu-button:focus:hover {
++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-lighten(st-mix(#ffffff, #4a4a4f, 9%), 4%), 5%); }
++ .quick-toggle-has-menu .quick-toggle-menu-button:hover {
++ color: #ffffff;
++ background-color: st-lighten(st-mix(#ffffff, #4a4a4f, 9%), 4%); }
++ .quick-toggle-has-menu .quick-toggle-menu-button:active {
++ color: #ffffff;
++ background-color: st-lighten(st-mix(#ffffff, #4a4a4f, 9%), 9%); }
++ .quick-toggle-has-menu .quick-toggle-menu-button:active:hover {
++ background-color: st-lighten(st-lighten(st-mix(#ffffff, #4a4a4f, 9%), 9%), 4%); }
++ .quick-toggle-has-menu .quick-toggle-menu-button:active:focus {
++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-lighten(st-mix(#ffffff, #4a4a4f, 9%), 9%), 5%); }
++ .quick-toggle-has-menu .quick-toggle-menu-button:checked {
++ color: -st-accent-fg-color;
++ background-color: st-mix(-st-accent-color, #ffffff, 85%); }
++ .quick-toggle-has-menu .quick-toggle-menu-button:checked:focus {
++ color: -st-accent-fg-color;
++ box-shadow: inset 0 0 0 2px st-transparentize(st-mix(-st-accent-color, #ffffff, 60%), 0.2) !important;
++ box-shadow: inset 0 0 0 2px st-transparentize(st-lighten(-st-accent-color, 30%), 0.2) !important;
++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(-st-accent-color, #ffffff, 85%), 5%); }
++ .quick-toggle-has-menu .quick-toggle-menu-button:checked:focus:hover {
++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-lighten(st-mix(-st-accent-color, #ffffff, 85%), 4%), 5%); }
++ .quick-toggle-has-menu .quick-toggle-menu-button:checked:hover {
++ color: -st-accent-fg-color;
++ background-color: st-lighten(st-mix(-st-accent-color, #ffffff, 85%), 4%); }
++ .quick-toggle-has-menu .quick-toggle-menu-button:checked:active {
++ color: -st-accent-fg-color;
++ background-color: st-lighten(st-mix(-st-accent-color, #ffffff, 85%), 9%); }
++ .quick-toggle-has-menu .quick-toggle-menu-button:checked:active:hover {
++ background-color: st-lighten(st-lighten(st-mix(-st-accent-color, #ffffff, 85%), 9%), 4%); }
++ .quick-toggle-has-menu .quick-toggle-menu-button:checked:active:focus {
++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-lighten(st-mix(-st-accent-color, #ffffff, 85%), 9%), 5%); }
++
++.quick-toggle-has-menu:checked .quick-toggle-separator {
++ background-color: st-mix(-st-accent-fg-color, -st-accent-color, 30%); }
++
++.quick-toggle-has-menu .quick-toggle-separator {
++ background-color: rgba(255, 255, 255, 0.25); }
+
+.quick-slider > StBoxLayout {
+ spacing: 6px; }
+
+.quick-slider .icon-button, .quick-slider .login-dialog-button.cancel-button, .quick-slider .login-dialog-button.switch-user-button, .quick-slider .login-dialog-button.login-dialog-session-list-button, .quick-slider .calendar .calendar-month-header .pager-button, .calendar .calendar-month-header .quick-slider .pager-button, .quick-slider .message .message-header .message-expand-button, .message .message-header .quick-slider .message-expand-button,
+.quick-slider .message .message-header .message-close-button,
+.message .message-header .quick-slider .message-close-button, .quick-slider .screenshot-ui-show-pointer-button {
+ padding: 6px; }
+
+.quick-slider .slider-bin {
+ padding: 6px;
+ border-radius: 999px; }
+ .quick-slider .slider-bin:focus {
+ color: #ffffff;
- background-color: st-mix(-st-accent-color, st-lighten(st-mix(#ffffff, #353535, 9%), 4%), 5%); }
++ box-shadow: inset 0 0 0 2px st-transparentize(st-mix(-st-accent-color, #ffffff, 60%), 0.2) !important;
++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(#ffffff, #36363a, 9%), 5%); }
+ .quick-slider .slider-bin:focus:hover {
- background-color: st-mix(#ffffff, #353535, 9%); }
++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-lighten(st-mix(#ffffff, #36363a, 9%), 4%), 5%); }
+
+.quick-toggle-menu {
+ border-radius: 24px;
+ margin: 12px 18px 0; }
+ .quick-toggle-menu:insensitive {
+ color: #ffffff;
- background-color: st-mix(#ffffff, #353535, 9%);
++ background-color: st-mix(#ffffff, #36363a, 9%); }
+ .quick-toggle-menu .popup-menu-item > StIcon {
+ -st-icon-style: symbolic;
+ icon-size: 1.091em; }
+ .quick-toggle-menu .header {
+ spacing-rows: 3px;
+ spacing-columns: 12px;
+ padding-bottom: 12px; }
+ .quick-toggle-menu .header .icon {
+ icon-size: 1.6365em;
+ border-radius: 999px;
+ padding: 9px;
+ background-color: rgba(255, 255, 255, 0.2); }
+ .quick-toggle-menu .header .icon.active {
+ background-color: -st-accent-color;
+ color: -st-accent-fg-color; }
+
+.quick-settings-system-item > StBoxLayout {
+ spacing: 12px; }
+
+.quick-settings-system-item .power-item {
+ min-height: 0;
+ min-width: 0; }
+ .quick-settings-system-item .power-item:insensitive {
+ color: #ffffff;
- background-color: #282828; }
++ background-color: st-mix(#ffffff, #36363a, 9%);
+ background-color: transparent; }
+
+.nm-network-item .wireless-secure-icon {
+ icon-size: 0.5455em; }
+
+.bt-device-item .popup-menu-icon {
+ -st-icon-style: symbolic; }
+
+.bt-menu-placeholder.popup-menu-item {
+ text-align: center;
+ padding: 2em 4em; }
+
+.device-subtitle {
+ color: rgba(255, 255, 255, 0.5); }
+
+.keyboard-brightness-level {
+ spacing: 6px; }
+
+.background-apps-quick-toggle {
+ min-height: 2.728em;
+ background-color: transparent; }
+ .background-apps-quick-toggle StIcon {
+ icon-size: 1.091em !important; }
+
+.background-app-item .popup-menu-icon {
+ icon-size: 32px !important;
+ -st-icon-style: regular !important; }
+
+.background-app-item .icon-button, .background-app-item .login-dialog-button.cancel-button, .background-app-item .login-dialog-button.switch-user-button, .background-app-item .login-dialog-button.login-dialog-session-list-button, .background-app-item .calendar .calendar-month-header .pager-button, .calendar .calendar-month-header .background-app-item .pager-button, .background-app-item .message .message-header .message-expand-button, .message .message-header .background-app-item .message-expand-button,
+.background-app-item .message .message-header .message-close-button,
+.message .message-header .background-app-item .message-close-button, .background-app-item .screenshot-ui-show-pointer-button {
+ padding: 6px;
+ background-color: rgba(255, 255, 255, 0.13); }
+ .background-app-item .icon-button:hover, .background-app-item .login-dialog-button.cancel-button:hover, .background-app-item .login-dialog-button.switch-user-button:hover, .background-app-item .login-dialog-button.login-dialog-session-list-button:hover, .background-app-item .calendar .calendar-month-header .pager-button:hover, .calendar .calendar-month-header .background-app-item .pager-button:hover, .background-app-item .message .message-header .message-expand-button:hover, .message .message-header .background-app-item .message-expand-button:hover,
+ .background-app-item .message .message-header .message-close-button:hover,
+ .message .message-header .background-app-item .message-close-button:hover, .background-app-item .screenshot-ui-show-pointer-button:hover {
+ background-color: rgba(255, 255, 255, 0.22); }
+ .background-app-item .icon-button:active, .background-app-item .login-dialog-button.cancel-button:active, .background-app-item .login-dialog-button.switch-user-button:active, .background-app-item .login-dialog-button.login-dialog-session-list-button:active, .background-app-item .calendar .calendar-month-header .pager-button:active, .calendar .calendar-month-header .background-app-item .pager-button:active, .background-app-item .message .message-header .message-expand-button:active, .message .message-header .background-app-item .message-expand-button:active,
+ .background-app-item .message .message-header .message-close-button:active,
+ .message .message-header .background-app-item .message-close-button:active, .background-app-item .screenshot-ui-show-pointer-button:active {
+ background-color: rgba(255, 255, 255, 0.31); }
+
+.background-app-item .spinner {
+ padding: 6px; }
+
+.background-app-item.popup-inactive-menu-item {
+ color: #ffffff; }
+
+/* OVERVIEW */
+.secondary-monitor-workspaces {
+ spacing: 12px; }
+
+#overviewGroup {
- background-color: rgba(71, 71, 71, 0.98);
- color: whitesmoke;
++ background-color: #222226; }
+
+/* Window Picker */
+.window-picker {
+ spacing: 6px; }
+
+.window-close, .screenshot-ui-close-button {
- background-color: rgba(88, 88, 88, 0.98); }
++ background-color: rgba(63, 63, 70, 0.98);
++ color: #fafafb;
+ border-radius: 999px;
+ box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.2);
+ padding: 3px;
+ height: 32px;
+ width: 32px;
+ transition-duration: 100ms;
+ border: 2px solid transparent; }
+ .window-close StIcon, .screenshot-ui-close-button StIcon {
+ icon-size: 24px; }
+ .window-close:hover, .screenshot-ui-close-button:hover {
- background-color: rgba(104, 104, 104, 0.98); }
++ background-color: rgba(80, 80, 89, 0.98); }
+ .window-close:active, .screenshot-ui-close-button:active {
- background-color: #3d3d3d;
- color: whitesmoke;
++ background-color: rgba(94, 94, 105, 0.98); }
+
+.workspace-background {
+ border-radius: 30px;
+ background-color: rgba(3, 2, 1, 0);
+ box-shadow: 0 4px 16px 4px rgba(0, 0, 0, 0.2); }
+
+.search-entry {
+ border-radius: 999px;
+ margin-top: 12px;
+ margin-bottom: 6px;
+ width: 24em; }
+ .search-entry .search-entry-icon {
+ icon-size: 1.091em;
+ margin-top: 2px;
+ padding: 0 4px; }
+
+/* Search */
+#searchResults {
+ margin: 0 4px; }
+
+#searchResultsContent {
+ max-width: 1044px; }
+
+.search-section {
+ spacing: 18px; }
+ .search-section .search-section-separator {
+ height: 8px;
+ background-color: transparent; }
+
+.search-section-content {
- color: whitesmoke;
- background-color: #3d3d3d;
++ background-color: #38383b;
++ color: #fafafb;
+ border-radius: 24px;
+ padding: 12px;
+ margin: 0 12px;
+ border: 2px solid transparent; }
+
+.list-search-result, .search-provider-icon {
- color: whitesmoke;
- box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.5) !important;
- background-color: st-mix(-st-accent-color, rgba(61, 61, 61, 0.25), 5%); }
++ color: #fafafb;
++ background-color: #38383b;
++ background-color: transparent;
+ border-radius: 13.2px; }
+ .list-search-result:focus, .search-provider-icon:focus {
- background-color: st-mix(-st-accent-color, st-lighten(#3d3d3d, 7%), 5%); }
++ color: #fafafb;
++ box-shadow: inset 0 0 0 2px st-transparentize(st-mix(-st-accent-color, #ffffff, 60%), 0.2) !important;
++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), rgba(56, 56, 59, 0.25), 5%); }
+ .list-search-result:focus:hover, .search-provider-icon:focus:hover {
- color: whitesmoke;
- background-color: st-lighten(#3d3d3d, 7%); }
++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-lighten(#38383b, 7%), 5%); }
+ .list-search-result:hover, .search-provider-icon:hover {
- color: whitesmoke;
- background-color: st-lighten(#3d3d3d, 9%); }
++ color: #fafafb;
++ background-color: st-lighten(#38383b, 7%); }
+ .list-search-result:active, .search-provider-icon:active {
- background-color: st-lighten(st-lighten(#3d3d3d, 9%), 7%); }
++ color: #fafafb;
++ background-color: st-lighten(#38383b, 9%); }
+ .list-search-result:active:hover, .search-provider-icon:active:hover {
- background-color: st-mix(-st-accent-color, st-lighten(#3d3d3d, 9%), 5%); }
++ background-color: st-lighten(st-lighten(#38383b, 9%), 7%); }
+ .list-search-result:active:focus, .search-provider-icon:active:focus {
- color: whitesmoke;
- background-color: st-lighten(#3d3d3d, 8%); }
++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-lighten(#38383b, 9%), 5%); }
+ .list-search-result:highlighted, .search-provider-icon:highlighted, .list-search-result:selected, .search-provider-icon:selected, .list-search-result:checked, .search-provider-icon:checked {
- background-color: st-lighten(st-lighten(#3d3d3d, 8%), 7%); }
++ color: #fafafb;
++ background-color: st-lighten(#38383b, 8%); }
+ .list-search-result:highlighted:hover, .search-provider-icon:highlighted:hover, .list-search-result:selected:hover, .search-provider-icon:selected:hover, .list-search-result:checked:hover, .search-provider-icon:checked:hover {
- background-color: st-lighten(st-lighten(#3d3d3d, 8%), 9%); }
++ background-color: st-lighten(st-lighten(#38383b, 8%), 7%); }
+ .list-search-result:highlighted:active, .search-provider-icon:highlighted:active, .list-search-result:selected:active, .search-provider-icon:selected:active, .list-search-result:checked:active, .search-provider-icon:checked:active {
- color: st-transparentize(whitesmoke, 0.5);
- background-color: #3d3d3d; }
++ background-color: st-lighten(st-lighten(#38383b, 8%), 9%); }
+ .list-search-result:insensitive, .search-provider-icon:insensitive {
- color: rgba(245, 245, 245, 0.8); }
++ color: st-transparentize(#fafafb, 0.5);
++ background-color: #38383b; }
+ .list-search-result:drop, .search-provider-icon:drop {
+ background-color: st-transparentize(-st-accent-color, 0.8);
+ box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.2); }
+
+.search-statustext {
- color: whitesmoke; }
++ color: rgba(250, 250, 251, 0.8); }
+
+.grid-search-results {
+ spacing: 30px; }
+
+.search-provider-icon:ltr {
+ margin-right: 4px; }
+
+.search-provider-icon:rtl {
+ margin-left: 4px; }
+
+.search-provider-icon .list-search-provider-content {
+ spacing: 12px; }
+ .search-provider-icon .list-search-provider-content .list-search-provider-details {
+ width: 120px;
- color: #959595; }
++ color: #fafafb; }
+
+.list-search-results {
+ spacing: 6px; }
+
+.list-search-result .list-search-result-content {
+ spacing: 6px; }
+
+.list-search-result .list-search-result-title {
+ spacing: 12px; }
+
+.list-search-result .list-search-result-description {
- background-color: #3d3d3d;
++ color: #949497; }
+
+/* Dash */
+#dash {
+ padding-left: 6px;
+ padding-right: 6px; }
+ #dash .dash-background {
- color: whitesmoke;
- background-color: #3d3d3d; }
++ background-color: #38383b;
+ border-radius: 28px;
+ padding-top: 12px;
+ padding-bottom: 12px;
+ padding-left: 10px;
+ padding-right: 10px; }
+ #dash .dash-item-container .placeholder {
+ background-image: none;
+ background-size: contain;
+ height: 32px; }
+ #dash .dash-item-container .empty-dash-drop-target {
+ width: 32px;
+ height: 32px; }
+ #dash .dash-item-container .show-apps,
+ #dash .dash-item-container .overview-tile,
+ #dash .dash-item-container .grid-search-result {
+ margin: 0 2px;
+ padding-bottom: 12px; }
+ #dash .dash-item-container .show-apps .overview-icon,
+ #dash .dash-item-container .overview-tile .overview-icon,
+ #dash .dash-item-container .grid-search-result .overview-icon {
- color: whitesmoke;
- box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.5) !important;
- background-color: st-mix(-st-accent-color, rgba(61, 61, 61, 0.25), 5%); }
++ color: #fafafb;
++ background-color: #38383b; }
+ #dash .dash-item-container .show-apps:focus .overview-icon,
+ #dash .dash-item-container .overview-tile:focus .overview-icon,
+ #dash .dash-item-container .grid-search-result:focus .overview-icon {
- background-color: st-mix(-st-accent-color, st-lighten(#3d3d3d, 7%), 5%); }
++ color: #fafafb;
++ box-shadow: inset 0 0 0 2px st-transparentize(st-mix(-st-accent-color, #ffffff, 60%), 0.2) !important;
++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), rgba(56, 56, 59, 0.25), 5%); }
+ #dash .dash-item-container .show-apps:focus .overview-icon:hover,
+ #dash .dash-item-container .overview-tile:focus .overview-icon:hover,
+ #dash .dash-item-container .grid-search-result:focus .overview-icon:hover {
- color: whitesmoke;
- background-color: st-lighten(#3d3d3d, 7%); }
++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-lighten(#38383b, 7%), 5%); }
+ #dash .dash-item-container .show-apps:hover .overview-icon,
+ #dash .dash-item-container .overview-tile:hover .overview-icon,
+ #dash .dash-item-container .grid-search-result:hover .overview-icon {
- color: whitesmoke;
- background-color: st-lighten(#3d3d3d, 9%); }
++ color: #fafafb;
++ background-color: st-lighten(#38383b, 7%); }
+ #dash .dash-item-container .show-apps:active .overview-icon,
+ #dash .dash-item-container .overview-tile:active .overview-icon,
+ #dash .dash-item-container .grid-search-result:active .overview-icon {
- background-color: st-lighten(st-lighten(#3d3d3d, 9%), 7%); }
++ color: #fafafb;
++ background-color: st-lighten(#38383b, 9%); }
+ #dash .dash-item-container .show-apps:active .overview-icon:hover,
+ #dash .dash-item-container .overview-tile:active .overview-icon:hover,
+ #dash .dash-item-container .grid-search-result:active .overview-icon:hover {
- background-color: st-mix(-st-accent-color, st-lighten(#3d3d3d, 9%), 5%); }
++ background-color: st-lighten(st-lighten(#38383b, 9%), 7%); }
+ #dash .dash-item-container .show-apps:active .overview-icon:focus,
+ #dash .dash-item-container .overview-tile:active .overview-icon:focus,
+ #dash .dash-item-container .grid-search-result:active .overview-icon:focus {
- color: whitesmoke;
- background-color: st-lighten(#3d3d3d, 8%); }
++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-lighten(#38383b, 9%), 5%); }
+ #dash .dash-item-container .show-apps:checked .overview-icon,
+ #dash .dash-item-container .overview-tile:checked .overview-icon,
+ #dash .dash-item-container .grid-search-result:checked .overview-icon {
- background-color: st-lighten(st-lighten(#3d3d3d, 8%), 7%); }
++ color: #fafafb;
++ background-color: st-lighten(#38383b, 8%); }
+ #dash .dash-item-container .show-apps:checked .overview-icon:hover,
+ #dash .dash-item-container .overview-tile:checked .overview-icon:hover,
+ #dash .dash-item-container .grid-search-result:checked .overview-icon:hover {
- background-color: st-lighten(st-lighten(#3d3d3d, 8%), 9%); }
++ background-color: st-lighten(st-lighten(#38383b, 8%), 7%); }
+ #dash .dash-item-container .show-apps:checked .overview-icon:active,
+ #dash .dash-item-container .overview-tile:checked .overview-icon:active,
+ #dash .dash-item-container .grid-search-result:checked .overview-icon:active {
- background-color: rgba(245, 245, 245, 0.1); }
++ background-color: st-lighten(st-lighten(#38383b, 8%), 9%); }
+ #dash .dash-item-container .app-grid-running-dot {
+ offset-y: -12px; }
+ #dash .dash-separator {
+ width: 1px;
+ margin-left: 4px;
+ margin-right: 4px;
- color: whitesmoke;
- background-color: #282828;
++ background-color: rgba(250, 250, 251, 0.1); }
+ #dash .dash-separator,
+ #dash .dash-background {
+ margin-bottom: 12px; }
+
+.dash-label {
+ -y-offset: 8px; }
+
+/* App Grid */
+.icon-grid {
+ row-spacing: 12px;
+ column-spacing: 12px;
+ max-row-spacing: 36px;
+ max-column-spacing: 36px;
+ page-padding-top: 24px;
+ page-padding-bottom: 24px;
+ page-padding-left: 18px;
+ page-padding-right: 18px; }
+
+/* App Icons */
+.overview-tile, .grid-search-result {
- color: whitesmoke;
- box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.5) !important;
- background-color: st-mix(-st-accent-color, rgba(40, 40, 40, 0.25), 5%); }
++ color: #fafafb;
++ background-color: #222226;
++ background-color: transparent;
+ border-radius: 24px;
+ padding: 12px; }
+ .overview-tile:focus, .grid-search-result:focus {
- background-color: st-mix(-st-accent-color, st-lighten(#282828, 7%), 5%); }
++ color: #fafafb;
++ box-shadow: inset 0 0 0 2px st-transparentize(st-mix(-st-accent-color, #ffffff, 60%), 0.2) !important;
++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), rgba(34, 34, 38, 0.25), 5%); }
+ .overview-tile:focus:hover, .grid-search-result:focus:hover {
- color: whitesmoke;
- background-color: st-lighten(#282828, 7%); }
++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-lighten(#222226, 7%), 5%); }
+ .overview-tile:hover, .grid-search-result:hover {
- color: whitesmoke;
- background-color: st-lighten(#282828, 9%); }
++ color: #fafafb;
++ background-color: st-lighten(#222226, 7%); }
+ .overview-tile:active, .grid-search-result:active {
- background-color: st-lighten(st-lighten(#282828, 9%), 7%); }
++ color: #fafafb;
++ background-color: st-lighten(#222226, 9%); }
+ .overview-tile:active:hover, .grid-search-result:active:hover {
- background-color: st-mix(-st-accent-color, st-lighten(#282828, 9%), 5%); }
++ background-color: st-lighten(st-lighten(#222226, 9%), 7%); }
+ .overview-tile:active:focus, .grid-search-result:active:focus {
- color: whitesmoke;
- background-color: st-lighten(#282828, 8%); }
++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-lighten(#222226, 9%), 5%); }
+ .overview-tile:highlighted, .grid-search-result:highlighted, .overview-tile:selected, .grid-search-result:selected, .overview-tile:checked, .grid-search-result:checked {
- background-color: st-lighten(st-lighten(#282828, 8%), 7%); }
++ color: #fafafb;
++ background-color: st-lighten(#222226, 8%); }
+ .overview-tile:highlighted:hover, .grid-search-result:highlighted:hover, .overview-tile:selected:hover, .grid-search-result:selected:hover, .overview-tile:checked:hover, .grid-search-result:checked:hover {
- background-color: st-lighten(st-lighten(#282828, 8%), 9%); }
++ background-color: st-lighten(st-lighten(#222226, 8%), 7%); }
+ .overview-tile:highlighted:active, .grid-search-result:highlighted:active, .overview-tile:selected:active, .grid-search-result:selected:active, .overview-tile:checked:active, .grid-search-result:checked:active {
- color: st-transparentize(whitesmoke, 0.5);
- background-color: #282828; }
++ background-color: st-lighten(st-lighten(#222226, 8%), 9%); }
+ .overview-tile:insensitive, .grid-search-result:insensitive {
- color: whitesmoke;
- background-color: st-mix(whitesmoke, #282828, 9%); }
++ color: st-transparentize(#fafafb, 0.5);
++ background-color: #222226; }
+ .overview-tile:drop, .grid-search-result:drop {
+ background-color: st-transparentize(-st-accent-color, 0.8);
+ box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.2); }
+ .overview-tile .overview-icon.overview-icon-with-label > StBoxLayout, .grid-search-result .overview-icon.overview-icon-with-label > StBoxLayout {
+ spacing: 6px; }
+
+.app-folder {
- color: whitesmoke;
- box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.5) !important;
- background-color: st-mix(-st-accent-color, st-mix(whitesmoke, #282828, 9%), 5%); }
++ color: #fafafb;
++ background-color: st-mix(#fafafb, #222226, 9%); }
+ .app-folder:focus {
- background-color: st-mix(-st-accent-color, st-lighten(st-mix(whitesmoke, #282828, 9%), 4%), 5%); }
++ color: #fafafb;
++ box-shadow: inset 0 0 0 2px st-transparentize(st-mix(-st-accent-color, #ffffff, 60%), 0.2) !important;
++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(#fafafb, #222226, 9%), 5%); }
+ .app-folder:focus:hover {
- color: whitesmoke;
- background-color: st-lighten(st-mix(whitesmoke, #282828, 9%), 4%); }
++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-lighten(st-mix(#fafafb, #222226, 9%), 4%), 5%); }
+ .app-folder:hover {
- color: whitesmoke;
- background-color: st-lighten(st-mix(whitesmoke, #282828, 9%), 9%); }
++ color: #fafafb;
++ background-color: st-lighten(st-mix(#fafafb, #222226, 9%), 4%); }
+ .app-folder:active {
- background-color: st-lighten(st-lighten(st-mix(whitesmoke, #282828, 9%), 9%), 4%); }
++ color: #fafafb;
++ background-color: st-lighten(st-mix(#fafafb, #222226, 9%), 9%); }
+ .app-folder:active:hover {
- background-color: st-mix(-st-accent-color, st-lighten(st-mix(whitesmoke, #282828, 9%), 9%), 5%); }
++ background-color: st-lighten(st-lighten(st-mix(#fafafb, #222226, 9%), 9%), 4%); }
+ .app-folder:active:focus {
- color: whitesmoke;
- background-color: st-lighten(st-mix(whitesmoke, #282828, 9%), 8%); }
++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-lighten(st-mix(#fafafb, #222226, 9%), 9%), 5%); }
+ .app-folder:highlighted, .app-folder:selected, .app-folder:checked {
- background-color: st-lighten(st-lighten(st-mix(whitesmoke, #282828, 9%), 8%), 4%); }
++ color: #fafafb;
++ background-color: st-lighten(st-mix(#fafafb, #222226, 9%), 8%); }
+ .app-folder:highlighted:hover, .app-folder:selected:hover, .app-folder:checked:hover {
- background-color: st-lighten(st-lighten(st-mix(whitesmoke, #282828, 9%), 8%), 9%); }
++ background-color: st-lighten(st-lighten(st-mix(#fafafb, #222226, 9%), 8%), 4%); }
+ .app-folder:highlighted:active, .app-folder:selected:active, .app-folder:checked:active {
- color: st-transparentize(whitesmoke, 0.5);
- background-color: st-darken(st-mix(whitesmoke, #282828, 9%), 3%); }
++ background-color: st-lighten(st-lighten(st-mix(#fafafb, #222226, 9%), 8%), 9%); }
+ .app-folder:insensitive {
- background-color: whitesmoke;
++ color: st-transparentize(#fafafb, 0.5);
++ background-color: st-darken(st-mix(#fafafb, #222226, 9%), 3%); }
+ .app-folder:drop {
+ background-color: st-transparentize(-st-accent-color, 0.8);
+ box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.2); }
+
+.app-grid-running-dot {
+ height: 5px;
+ width: 5px;
+ border-radius: 5px;
- background-color: #3d3d3d;
- color: whitesmoke;
++ background-color: #fafafb;
+ offset-y: 6px; }
+
+.app-folder-dialog-container {
+ padding-top: 2.2em; }
+
+.app-folder-dialog {
+ width: 720px;
+ height: 720px;
+ border-radius: 64px;
- box-shadow: inset 0 0 0 1px rgba(245, 245, 245, 0.1); }
++ background-color: #38383b;
++ color: #fafafb;
+ padding: 0 1px;
- color: whitesmoke;
- background-color: st-mix(whitesmoke, #3d3d3d, 9%); }
++ box-shadow: inset 0 0 0 1px rgba(250, 250, 251, 0.1); }
+ .app-folder-dialog .folder-name-container {
+ padding: 24px 36px;
+ padding-bottom: 0; }
+ .app-folder-dialog .folder-name-container .folder-name-entry {
+ width: 12em; }
+ .app-folder-dialog .icon-button, .app-folder-dialog .login-dialog-button.cancel-button, .app-folder-dialog .login-dialog-button.switch-user-button, .app-folder-dialog .login-dialog-button.login-dialog-session-list-button, .app-folder-dialog .calendar .calendar-month-header .pager-button, .calendar .calendar-month-header .app-folder-dialog .pager-button, .app-folder-dialog .message .message-header .message-expand-button, .message .message-header .app-folder-dialog .message-expand-button,
+ .app-folder-dialog .message .message-header .message-close-button,
+ .message .message-header .app-folder-dialog .message-close-button, .app-folder-dialog .screenshot-ui-show-pointer-button {
- color: whitesmoke;
- background-color: st-lighten(st-mix(whitesmoke, #3d3d3d, 9%), 4%); }
++ color: #fafafb;
++ background-color: st-mix(#fafafb, #38383b, 9%); }
+ .app-folder-dialog .icon-button:hover, .app-folder-dialog .login-dialog-button.cancel-button:hover, .app-folder-dialog .login-dialog-button.switch-user-button:hover, .app-folder-dialog .login-dialog-button.login-dialog-session-list-button:hover, .app-folder-dialog .calendar .calendar-month-header .pager-button:hover, .calendar .calendar-month-header .app-folder-dialog .pager-button:hover, .app-folder-dialog .message .message-header .message-expand-button:hover, .message .message-header .app-folder-dialog .message-expand-button:hover,
+ .app-folder-dialog .message .message-header .message-close-button:hover,
+ .message .message-header .app-folder-dialog .message-close-button:hover, .app-folder-dialog .screenshot-ui-show-pointer-button:hover {
- color: whitesmoke;
- background-color: st-lighten(st-mix(whitesmoke, #3d3d3d, 9%), 9%); }
++ color: #fafafb;
++ background-color: st-lighten(st-mix(#fafafb, #38383b, 9%), 4%); }
+ .app-folder-dialog .icon-button:active, .app-folder-dialog .login-dialog-button.cancel-button:active, .app-folder-dialog .login-dialog-button.switch-user-button:active, .app-folder-dialog .login-dialog-button.login-dialog-session-list-button:active, .app-folder-dialog .calendar .calendar-month-header .pager-button:active, .calendar .calendar-month-header .app-folder-dialog .pager-button:active, .app-folder-dialog .message .message-header .message-expand-button:active, .message .message-header .app-folder-dialog .message-expand-button:active,
+ .app-folder-dialog .message .message-header .message-close-button:active,
+ .message .message-header .app-folder-dialog .message-close-button:active, .app-folder-dialog .screenshot-ui-show-pointer-button:active {
- background-color: st-lighten(st-lighten(st-mix(whitesmoke, #3d3d3d, 9%), 9%), 4%); }
++ color: #fafafb;
++ background-color: st-lighten(st-mix(#fafafb, #38383b, 9%), 9%); }
+ .app-folder-dialog .icon-button:active:hover, .app-folder-dialog .login-dialog-button.cancel-button:active:hover, .app-folder-dialog .login-dialog-button.switch-user-button:active:hover, .app-folder-dialog .login-dialog-button.login-dialog-session-list-button:active:hover, .app-folder-dialog .calendar .calendar-month-header .pager-button:active:hover, .calendar .calendar-month-header .app-folder-dialog .pager-button:active:hover, .app-folder-dialog .message .message-header .message-expand-button:active:hover, .message .message-header .app-folder-dialog .message-expand-button:active:hover,
+ .app-folder-dialog .message .message-header .message-close-button:active:hover,
+ .message .message-header .app-folder-dialog .message-close-button:active:hover, .app-folder-dialog .screenshot-ui-show-pointer-button:active:hover {
- background-color: st-mix(-st-accent-color, st-lighten(st-mix(whitesmoke, #3d3d3d, 9%), 9%), 5%); }
++ background-color: st-lighten(st-lighten(st-mix(#fafafb, #38383b, 9%), 9%), 4%); }
+ .app-folder-dialog .icon-button:active:focus, .app-folder-dialog .login-dialog-button.cancel-button:active:focus, .app-folder-dialog .login-dialog-button.switch-user-button:active:focus, .app-folder-dialog .login-dialog-button.login-dialog-session-list-button:active:focus, .app-folder-dialog .calendar .calendar-month-header .pager-button:active:focus, .calendar .calendar-month-header .app-folder-dialog .pager-button:active:focus, .app-folder-dialog .message .message-header .message-expand-button:active:focus, .message .message-header .app-folder-dialog .message-expand-button:active:focus,
+ .app-folder-dialog .message .message-header .message-close-button:active:focus,
+ .message .message-header .app-folder-dialog .message-close-button:active:focus, .app-folder-dialog .screenshot-ui-show-pointer-button:active:focus {
- color: whitesmoke;
- background-color: #3d3d3d; }
++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-lighten(st-mix(#fafafb, #38383b, 9%), 9%), 5%); }
+ .app-folder-dialog .page-indicators {
+ margin-bottom: 24px; }
+ .app-folder-dialog .page-navigation-arrow {
- color: whitesmoke;
- background-color: st-lighten(#3d3d3d, 7%); }
++ color: #fafafb;
++ background-color: #38383b; }
+ .app-folder-dialog .page-navigation-arrow:hover {
- color: whitesmoke;
- background-color: st-lighten(#3d3d3d, 9%); }
++ color: #fafafb;
++ background-color: st-lighten(#38383b, 7%); }
+ .app-folder-dialog .page-navigation-arrow:active {
- background-color: st-lighten(st-lighten(#3d3d3d, 9%), 7%); }
++ color: #fafafb;
++ background-color: st-lighten(#38383b, 9%); }
+ .app-folder-dialog .page-navigation-arrow:active:hover {
- background-color: st-mix(-st-accent-color, st-lighten(#3d3d3d, 9%), 5%); }
++ background-color: st-lighten(st-lighten(#38383b, 9%), 7%); }
+ .app-folder-dialog .page-navigation-arrow:active:focus {
- color: whitesmoke;
- background-color: #3d3d3d; }
++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-lighten(#38383b, 9%), 5%); }
+ .app-folder-dialog .overview-tile, .app-folder-dialog .grid-search-result {
- color: whitesmoke;
- box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.5) !important;
- background-color: st-mix(-st-accent-color, rgba(61, 61, 61, 0.25), 5%); }
++ color: #fafafb;
++ background-color: #38383b;
++ background-color: transparent; }
+ .app-folder-dialog .overview-tile:focus, .app-folder-dialog .grid-search-result:focus {
- background-color: st-mix(-st-accent-color, st-lighten(#3d3d3d, 7%), 5%); }
++ color: #fafafb;
++ box-shadow: inset 0 0 0 2px st-transparentize(st-mix(-st-accent-color, #ffffff, 60%), 0.2) !important;
++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), rgba(56, 56, 59, 0.25), 5%); }
+ .app-folder-dialog .overview-tile:focus:hover, .app-folder-dialog .grid-search-result:focus:hover {
- color: whitesmoke;
- background-color: st-lighten(#3d3d3d, 7%); }
++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-lighten(#38383b, 7%), 5%); }
+ .app-folder-dialog .overview-tile:hover, .app-folder-dialog .grid-search-result:hover {
- color: whitesmoke;
- background-color: st-lighten(#3d3d3d, 9%); }
++ color: #fafafb;
++ background-color: st-lighten(#38383b, 7%); }
+ .app-folder-dialog .overview-tile:active, .app-folder-dialog .grid-search-result:active {
- background-color: st-lighten(st-lighten(#3d3d3d, 9%), 7%); }
++ color: #fafafb;
++ background-color: st-lighten(#38383b, 9%); }
+ .app-folder-dialog .overview-tile:active:hover, .app-folder-dialog .grid-search-result:active:hover {
- background-color: st-mix(-st-accent-color, st-lighten(#3d3d3d, 9%), 5%); }
++ background-color: st-lighten(st-lighten(#38383b, 9%), 7%); }
+ .app-folder-dialog .overview-tile:active:focus, .app-folder-dialog .grid-search-result:active:focus {
- color: whitesmoke;
- background-color: st-lighten(#3d3d3d, 8%); }
++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-lighten(#38383b, 9%), 5%); }
+ .app-folder-dialog .overview-tile:highlighted, .app-folder-dialog .grid-search-result:highlighted, .app-folder-dialog .overview-tile:selected, .app-folder-dialog .grid-search-result:selected, .app-folder-dialog .overview-tile:checked, .app-folder-dialog .grid-search-result:checked {
- background-color: st-lighten(st-lighten(#3d3d3d, 8%), 7%); }
++ color: #fafafb;
++ background-color: st-lighten(#38383b, 8%); }
+ .app-folder-dialog .overview-tile:highlighted:hover, .app-folder-dialog .grid-search-result:highlighted:hover, .app-folder-dialog .overview-tile:selected:hover, .app-folder-dialog .grid-search-result:selected:hover, .app-folder-dialog .overview-tile:checked:hover, .app-folder-dialog .grid-search-result:checked:hover {
- background-color: st-lighten(st-lighten(#3d3d3d, 8%), 9%); }
++ background-color: st-lighten(st-lighten(#38383b, 8%), 7%); }
+ .app-folder-dialog .overview-tile:highlighted:active, .app-folder-dialog .grid-search-result:highlighted:active, .app-folder-dialog .overview-tile:selected:active, .app-folder-dialog .grid-search-result:selected:active, .app-folder-dialog .overview-tile:checked:active, .app-folder-dialog .grid-search-result:checked:active {
- color: st-transparentize(whitesmoke, 0.5);
- background-color: #3d3d3d; }
++ background-color: st-lighten(st-lighten(#38383b, 8%), 9%); }
+ .app-folder-dialog .overview-tile:insensitive, .app-folder-dialog .grid-search-result:insensitive {
- background-color: whitesmoke;
++ color: st-transparentize(#fafafb, 0.5);
++ background-color: #38383b; }
+ .app-folder-dialog .overview-tile:drop, .app-folder-dialog .grid-search-result:drop {
+ background-color: st-transparentize(-st-accent-color, 0.8);
+ box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.2); }
+
+.rename-folder-popup .rename-folder-popup-item {
+ spacing: 6px; }
+ .rename-folder-popup .rename-folder-popup-item:ltr, .rename-folder-popup .rename-folder-popup-item:rtl {
+ padding: 0 12px; }
+
+.page-indicator {
+ padding: 6px 12px 0;
+ transition-duration: 400ms; }
+ .page-indicator .page-indicator-icon {
+ width: 10px;
+ height: 10px;
+ border-radius: 999px;
- background-color: rgba(245, 245, 245, 0.1);
- color: whitesmoke;
++ background-color: #fafafb;
+ transition-duration: 400ms; }
+
+.apps-scroll-view {
+ padding: 0; }
+
+.system-action-icon {
- color: whitesmoke;
- background-color: #282828; }
++ background-color: rgba(250, 250, 251, 0.1);
++ color: #fafafb;
+ border-radius: 999px;
+ icon-size: 48px; }
+
+.page-navigation-hint.dnd {
+ background: rgba(255, 255, 255, 0.1); }
+
+.page-navigation-hint.next:ltr, .page-navigation-hint.previous:rtl {
+ background-gradient-start: rgba(255, 255, 255, 0.05);
+ background-gradient-end: transparent;
+ background-gradient-direction: horizontal;
+ border-radius: 24px 0px 0px 24px; }
+
+.page-navigation-hint.previous:ltr, .page-navigation-hint.next:rtl {
+ background-gradient-start: transparent;
+ background-gradient-end: rgba(255, 255, 255, 0.05);
+ background-gradient-direction: horizontal;
+ border-radius: 0px 24px 24px 0px; }
+
+.page-navigation-arrow {
+ margin: 6px;
+ padding: 18px;
+ width: 24px;
+ height: 24px;
+ border-radius: 999px;
+ transition-duration: 100ms;
- color: whitesmoke; }
++ color: #fafafb;
++ background-color: #222226; }
+ .page-navigation-arrow > StIcon {
- color: whitesmoke;
- background-color: st-lighten(#282828, 7%); }
++ color: #fafafb; }
+ .page-navigation-arrow:hover {
- color: whitesmoke;
- background-color: st-lighten(#282828, 9%); }
++ color: #fafafb;
++ background-color: st-lighten(#222226, 7%); }
+ .page-navigation-arrow:active {
- background-color: st-lighten(st-lighten(#282828, 9%), 7%); }
++ color: #fafafb;
++ background-color: st-lighten(#222226, 9%); }
+ .page-navigation-arrow:active:hover {
- background-color: st-mix(-st-accent-color, st-lighten(#282828, 9%), 5%); }
++ background-color: st-lighten(st-lighten(#222226, 9%), 7%); }
+ .page-navigation-arrow:active:focus {
- color: whitesmoke;
- background-color: #4e4e4e;
++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-lighten(#222226, 9%), 5%); }
+
+/* Workspace pager */
+.workspace-thumbnails {
+ visible-width: 32px;
+ spacing: 6px;
+ padding: 6px; }
+ .workspace-thumbnails .workspace-thumbnail {
- color: #f6d32d; }
++ color: #fafafb;
++ background-color: #46464e;
+ border-radius: 4px;
+ border: 1px solid transparent; }
+ .workspace-thumbnails .placeholder {
+ background-image: url("resource:///org/gnome/shell/theme/workspace-placeholder.svg");
+ background-size: contain;
+ width: 18px; }
+
+.workspace-thumbnail-indicator {
+ border: 3px solid -st-accent-color;
+ border-radius: 8px; }
+
+.ripple-pointer-location {
+ width: 50px;
+ height: 50px;
+ border-radius: 25px;
+ background-color: st-lighten(st-transparentize(-st-accent-color, 0.7), 30%);
+ box-shadow: 0 0 2px 2px st-lighten(-st-accent-color, 20%); }
+
+.pie-timer {
+ width: 60px;
+ height: 60px;
+ -pie-border-width: 3px;
+ -pie-border-color: -st-accent-color;
+ -pie-background-color: st-lighten(st-transparentize(-st-accent-color, 0.7), 40%); }
+
+.magnifier-zoom-region {
+ border: 2px solid -st-accent-color; }
+ .magnifier-zoom-region.full-screen {
+ border-width: 0; }
+
+.select-area-rubberband {
+ background-color: st-transparentize(-st-accent-color, 0.7);
+ border: 1px solid -st-accent-color; }
+
+.user-icon {
+ background-size: contain;
+ border-radius: 999px;
+ icon-size: 64px;
+ background-color: rgba(255, 255, 255, 0.05);
+ color: #ffffff; }
+ .user-icon StIcon {
+ padding: 12px; }
+ .user-icon.user-avatar {
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.1); }
+
+.lightbox {
+ background-color: black; }
+
+.flashspot {
+ background-color: white; }
+
+.hidden {
+ color: transparent; }
+
+.caps-lock-warning-label {
+ text-align: center;
+ padding-bottom: 8px;
- background-color: #353535; }
++ color: #cd9309; }
+
+/* Workspace animation */
+.workspace-animation {
- background-color: #353535;
++ background-color: #2e2e33; }
+
+/* Tiled window previews */
+.tile-preview {
+ background-color: st-transparentize(-st-accent-color, 0.5);
+ border: 1px solid -st-accent-color; }
+
+/* On-screen Keyboard */
+#keyboard {
- min-height: 1.2em;
- min-width: 1.2em;
- border-width: 1px;
- border-style: solid;
- border-radius: 10px;
++ background-color: #2e2e33;
+ box-shadow: inset 0 1px 0 0 rgba(255, 255, 255, 0.02); }
+ #keyboard .page-indicator {
+ padding: 6px; }
+ #keyboard .page-indicator .page-indicator-icon {
+ width: 8px;
+ height: 8px; }
+
+.key-container {
+ padding: 4px;
+ spacing: 4px; }
+
+.keyboard-key {
+ font-size: 1.455em;
+ font-weight: bold;
- box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.5) !important;
- background-color: st-mix(-st-accent-color, st-mix(#ffffff, #353535, 9%), 5%); }
++ border-radius: 0.546em;
+ box-shadow: 0 1px 0 0 rgba(0, 0, 0, 0.2);
+ color: #ffffff;
+ background-color: st-mix(#ffffff, #4d4d4d, 9%); }
+ .keyboard-key:focus {
+ color: #ffffff;
- background-color: st-mix(-st-accent-color, st-lighten(st-mix(#ffffff, #353535, 9%), 4%), 5%); }
++ box-shadow: inset 0 0 0 2px st-transparentize(st-mix(-st-accent-color, #ffffff, 60%), 0.2) !important;
++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(#ffffff, #36363a, 9%), 5%); }
+ .keyboard-key:focus:hover {
- background-color: st-mix(-st-accent-color, st-lighten(st-mix(#ffffff, #4d4d4d, 9%), 9%), 5%); }
++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-lighten(st-mix(#ffffff, #36363a, 9%), 4%), 5%); }
+ .keyboard-key:hover {
+ color: #ffffff;
+ background-color: st-lighten(st-mix(#ffffff, #4d4d4d, 9%), 4%); }
+ .keyboard-key:active {
+ color: #ffffff;
+ background-color: st-lighten(st-mix(#ffffff, #4d4d4d, 9%), 9%); }
+ .keyboard-key:active:hover {
+ background-color: st-lighten(st-lighten(st-mix(#ffffff, #4d4d4d, 9%), 9%), 4%); }
+ .keyboard-key:active:focus {
- .keyboard-key:grayed {
- background-color: #2d2d2d;
- color: #ffffff;
- border-color: rgba(255, 255, 255, 0.1); }
++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-lighten(st-mix(#ffffff, #4d4d4d, 9%), 9%), 5%); }
+ .keyboard-key:checked {
+ color: #ffffff;
+ background-color: st-lighten(st-mix(#ffffff, #4d4d4d, 9%), 8%); }
+ .keyboard-key:checked:hover {
+ background-color: st-lighten(st-lighten(st-mix(#ffffff, #4d4d4d, 9%), 8%), 4%); }
+ .keyboard-key:checked:active {
+ background-color: st-lighten(st-lighten(st-mix(#ffffff, #4d4d4d, 9%), 8%), 9%); }
- border-radius: 10px; }
+ .keyboard-key.default-key {
+ color: #ffffff;
+ background-color: st-mix(#ffffff, #333333, 9%);
- background-color: st-mix(-st-accent-color, st-lighten(st-mix(#ffffff, #333333, 9%), 9%), 5%); }
++ border: none; }
+ .keyboard-key.default-key:hover {
+ color: #ffffff;
+ background-color: st-lighten(st-mix(#ffffff, #333333, 9%), 4%); }
+ .keyboard-key.default-key:active {
+ color: #ffffff;
+ background-color: st-lighten(st-mix(#ffffff, #333333, 9%), 9%); }
+ .keyboard-key.default-key:active:hover {
+ background-color: st-lighten(st-lighten(st-mix(#ffffff, #333333, 9%), 9%), 4%); }
+ .keyboard-key.default-key:active:focus {
- border-color: st-lighten(-st-accent-color, 5%);
++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-lighten(st-mix(#ffffff, #333333, 9%), 9%), 5%); }
+ .keyboard-key.default-key:checked {
+ color: #ffffff;
+ background-color: st-lighten(st-mix(#ffffff, #333333, 9%), 8%); }
+ .keyboard-key.default-key:checked:hover {
+ background-color: st-lighten(st-lighten(st-mix(#ffffff, #333333, 9%), 8%), 4%); }
+ .keyboard-key.default-key:checked:active {
+ background-color: st-lighten(st-lighten(st-mix(#ffffff, #333333, 9%), 8%), 9%); }
+ .keyboard-key.default-key:latched {
- .keyboard-key.enter-key {
- color: -st-accent-fg-color;
- background-color: st-mix(-st-accent-fg-color, -st-accent-color, 9%);
- border-radius: 10px;
- color: #ffffff; }
- .keyboard-key.enter-key:hover {
- color: -st-accent-fg-color;
- background-color: st-lighten(st-mix(-st-accent-fg-color, -st-accent-color, 9%), 4%); }
- .keyboard-key.enter-key:active {
- color: -st-accent-fg-color;
- background-color: st-lighten(st-mix(-st-accent-fg-color, -st-accent-color, 9%), 9%); }
- .keyboard-key.enter-key:active:hover {
- background-color: st-lighten(st-lighten(st-mix(-st-accent-fg-color, -st-accent-color, 9%), 9%), 4%); }
- .keyboard-key.enter-key:active:focus {
- background-color: st-mix(-st-accent-color, st-lighten(st-mix(-st-accent-fg-color, -st-accent-color, 9%), 9%), 5%); }
- .keyboard-key.enter-key:checked {
- color: -st-accent-fg-color;
- background-color: st-lighten(st-mix(-st-accent-fg-color, -st-accent-color, 9%), 8%); }
- .keyboard-key.enter-key:checked:hover {
- background-color: st-lighten(st-lighten(st-mix(-st-accent-fg-color, -st-accent-color, 9%), 8%), 4%); }
- .keyboard-key.enter-key:checked:active {
- background-color: st-lighten(st-lighten(st-mix(-st-accent-fg-color, -st-accent-color, 9%), 8%), 9%); }
- .keyboard-key.shift-key-uppercase {
- background-color: gray;
- color: #353535; }
- .keyboard-key.shift-key-uppercase:hover {
- background-color: #8c8c8c;
- color: #424242; }
+ background-color: -st-accent-color; }
- icon-size: 24px; }
+ .keyboard-key StIcon {
- .keyboard-subkeys {
- -arrow-border-radius: 16px;
- -arrow-background-color: #353535;
++ icon-size: 1.6365em; }
+
- -arrow-border-color: #4c4c4c;
++.keyboard-subkeys-boxpointer {
++ -arrow-border-radius: 22px;
++ -arrow-background-color: #2e2e33;
+ -arrow-border-width: 1px;
- -boxpointer-gap: 6px;
- padding: 6px; }
- .keyboard-subkeys .keyboard-key {
- color: #ffffff;
- background-color: st-mix(#ffffff, #4d4d4d, 9%);
- border-radius: 10px; }
- .keyboard-subkeys .keyboard-key:focus {
- color: #ffffff;
- box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.5) !important;
- background-color: st-mix(-st-accent-color, st-mix(#ffffff, #353535, 9%), 5%); }
- .keyboard-subkeys .keyboard-key:focus:hover {
- background-color: st-mix(-st-accent-color, st-lighten(st-mix(#ffffff, #353535, 9%), 4%), 5%); }
- .keyboard-subkeys .keyboard-key:hover {
- color: #ffffff;
- background-color: st-lighten(st-mix(#ffffff, #4d4d4d, 9%), 4%); }
- .keyboard-subkeys .keyboard-key:active {
- color: #ffffff;
- background-color: st-lighten(st-mix(#ffffff, #4d4d4d, 9%), 9%); }
- .keyboard-subkeys .keyboard-key:active:hover {
- background-color: st-lighten(st-lighten(st-mix(#ffffff, #4d4d4d, 9%), 9%), 4%); }
- .keyboard-subkeys .keyboard-key:active:focus {
- background-color: st-mix(-st-accent-color, st-lighten(st-mix(#ffffff, #4d4d4d, 9%), 9%), 5%); }
- .keyboard-subkeys .keyboard-key:checked {
- color: #ffffff;
- background-color: st-lighten(st-mix(#ffffff, #4d4d4d, 9%), 8%); }
- .keyboard-subkeys .keyboard-key:checked:hover {
- background-color: st-lighten(st-lighten(st-mix(#ffffff, #4d4d4d, 9%), 8%), 4%); }
- .keyboard-subkeys .keyboard-key:checked:active {
- background-color: st-lighten(st-lighten(st-mix(#ffffff, #4d4d4d, 9%), 8%), 9%); }
++ -arrow-border-color: #44444c;
+ -arrow-base: 20px;
+ -arrow-rise: 10px;
- padding: 0px 18px;
++ -boxpointer-gap: 4px;
++ border-radius: 22px;
++ box-shadow: 0 0 12px 0 rgba(0, 0, 0, 0.1); }
++ .keyboard-subkeys-boxpointer .key-container {
++ padding: 12px;
++ spacing: 8px; }
+
+.emoji-page .keyboard-key {
+ background-color: transparent;
+ border: none;
+ color: initial; }
+
+.emoji-panel .keyboard-key:latched {
+ border-color: st-lighten(-st-accent-color, 5%);
+ background-color: -st-accent-color; }
+
+.word-suggestions {
+ spacing: 12px;
+ min-height: 17pt;
+ padding: 12px;
+ color: #ffffff; }
+ .word-suggestions StButton {
+ margin: 0 3px;
+ min-width: 32px;
+ border-radius: 4px;
- box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.5) !important;
- background-color: st-mix(-st-accent-color, st-mix(#ffffff, #353535, 9%), 5%); }
++ padding: 6px 18px;
+ background-color: transparent;
+ border-color: transparent;
+ box-shadow: none; }
+ .word-suggestions StButton:insensitive {
+ background-color: transparent !important; }
+ .word-suggestions StButton:focus {
+ color: #ffffff;
- background-color: st-mix(-st-accent-color, st-lighten(st-mix(#ffffff, #353535, 9%), 4%), 5%); }
++ box-shadow: inset 0 0 0 2px st-transparentize(st-mix(-st-accent-color, #ffffff, 60%), 0.2) !important;
++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(#ffffff, #36363a, 9%), 5%); }
+ .word-suggestions StButton:focus:hover {
- background-color: st-mix(-st-accent-color, st-lighten(st-mix(#ffffff, #4d4d4d, 9%), 9%), 5%); }
++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-lighten(st-mix(#ffffff, #36363a, 9%), 4%), 5%); }
+ .word-suggestions StButton:hover {
+ color: #ffffff;
+ background-color: st-lighten(st-mix(#ffffff, #4d4d4d, 9%), 4%); }
+ .word-suggestions StButton:active {
+ color: #ffffff;
+ background-color: st-lighten(st-mix(#ffffff, #4d4d4d, 9%), 9%); }
+ .word-suggestions StButton:active:hover {
+ background-color: st-lighten(st-lighten(st-mix(#ffffff, #4d4d4d, 9%), 9%), 4%); }
+ .word-suggestions StButton:active:focus {
- background-color: rgba(53, 53, 53, 0.98);
++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-lighten(st-mix(#ffffff, #4d4d4d, 9%), 9%), 5%); }
+ .word-suggestions StButton:checked {
+ color: #ffffff;
+ background-color: st-lighten(st-mix(#ffffff, #4d4d4d, 9%), 8%); }
+ .word-suggestions StButton:checked:hover {
+ background-color: st-lighten(st-lighten(st-mix(#ffffff, #4d4d4d, 9%), 8%), 4%); }
+ .word-suggestions StButton:checked:active {
+ background-color: st-lighten(st-lighten(st-mix(#ffffff, #4d4d4d, 9%), 8%), 9%); }
+
+/* Looking Glass */
+.lg-dialog StEntry {
+ min-height: 1.5em; }
+
+.lg-dialog .shell-link {
+ color: st-lighten(-st-accent-color, 20%); }
+ .lg-dialog .shell-link:hover {
+ color: st-lighten(st-lighten(-st-accent-color, 20%), 10%); }
+ .lg-dialog .shell-link:active {
+ color: st-darken(st-lighten(-st-accent-color, 20%), 10%); }
+
+.lg-dialog .actor-link {
+ color: st-darken(#ffffff, 20%); }
+ .lg-dialog .actor-link:hover {
+ color: #ffffff; }
+ .lg-dialog .actor-link:active {
+ color: st-lighten(#ffffff, 20%); }
+ .lg-dialog .actor-link StIcon {
+ icon-size: 12px; }
+
+.lg-completions-text {
+ font-style: italic; }
+
+#LookingGlassDialog {
- background-color: st-lighten(st-mix(#ffffff, #353535, 9%), 9%); }
++ background-color: rgba(46, 46, 51, 0.98);
+ color: #ffffff;
+ border-radius: 16px;
+ margin-top: 4px;
+ border: 2px solid transparent;
+ padding: 6px;
+ spacing: 6px;
+ box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.2); }
+ #LookingGlassDialog > #Toolbar {
+ border: none;
+ padding: 6px;
+ border-radius: 0;
+ background-color: transparent;
+ spacing: 6px; }
+ #LookingGlassDialog > #Toolbar .lg-toolbar-button {
+ padding: 6px 12px; }
+ #LookingGlassDialog > #Toolbar .lg-toolbar-button > StIcon {
+ icon-size: 16px; }
+ #LookingGlassDialog .labels {
+ spacing: 6px; }
+ #LookingGlassDialog .notebook-tab {
+ background-color: transparent;
+ -natural-hpadding: 12px;
+ -minimum-hpadding: 12px;
+ padding: 6px 12px; }
+ #LookingGlassDialog .notebook-tab:selected {
+ color: #ffffff;
- background-color: st-lighten(st-lighten(st-mix(#ffffff, #353535, 9%), 9%), 4%); }
++ background-color: st-lighten(st-mix(#ffffff, #2e2e33, 9%), 9%); }
+ #LookingGlassDialog .notebook-tab:selected:hover {
- background-color: st-mix(-st-accent-color, st-lighten(st-mix(#ffffff, #353535, 9%), 9%), 5%); }
++ background-color: st-lighten(st-lighten(st-mix(#ffffff, #2e2e33, 9%), 9%), 4%); }
+ #LookingGlassDialog .notebook-tab:selected:focus {
- background-color: #353535;
++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-lighten(st-mix(#ffffff, #2e2e33, 9%), 9%), 5%); }
+
+#LookingGlassPropertyInspector {
- background-color: st-mix(#ffffff, #353535, 9%);
++ background-color: #2e2e33;
+ color: #ffffff;
+ border-radius: 16px;
+ border: 1px solid rgba(255, 255, 255, 0.1);
+ padding: 12px; }
+ #LookingGlassPropertyInspector .lg-obj-inspector-title {
+ spacing: 4px; }
+ #LookingGlassPropertyInspector .lg-obj-inspector-close-button,
+ #LookingGlassPropertyInspector .lg-obj-inspector-button {
+ padding: 6px 12px; }
+ #LookingGlassPropertyInspector .lg-obj-inspector-close-button {
+ margin: 4px;
+ padding: 6px;
+ border-radius: 999px; }
+ #LookingGlassPropertyInspector .lg-obj-inspector-close-button > StIcon {
+ icon-size: 16px; }
+
+#LookingGlassEvaluator {
+ padding: 6px; }
+ #LookingGlassEvaluator .evaluator-results {
+ spacing: 6px; }
+
+#LookingGlassWindows {
+ padding: 6px;
+ spacing: 6px; }
+ #LookingGlassWindows .lg-window {
+ color: #ffffff;
- background-color: st-mix(#ffffff, #353535, 9%);
++ background-color: st-mix(#ffffff, #2e2e33, 9%);
+ margin: 0;
+ padding: 12px; }
+
+#LookingGlassExtensions .lg-extensions-list {
+ padding: 6px;
+ spacing: 6px; }
+
+#LookingGlassExtensions .lg-extension {
+ color: #ffffff;
- color: whitesmoke; }
++ background-color: st-mix(#ffffff, #2e2e33, 9%);
+ margin: 0;
+ spacing: 4px;
+ padding: 12px; }
+ #LookingGlassExtensions .lg-extension .lg-extension-name {
+ color: #ffffff !important; }
+ #LookingGlassExtensions .lg-extension .lg-extension-meta {
+ spacing: 12px; }
+
+#LookingGlassExtensions .lg-extensions-none {
+ color: rgba(255, 255, 255, 0.5); }
+
+#LookingGlassActors {
+ padding: 6px;
+ spacing: 4px; }
+
+#LookingGlassDebugFlags .lg-debug-flags-header {
+ padding: 6px;
+ padding-top: 12px; }
+
+#LookingGlassDebugFlags .lg-debug-flag-button {
+ padding: 9px 12px;
+ margin-bottom: 6px; }
+ #LookingGlassDebugFlags .lg-debug-flag-button StLabel {
+ font-weight: normal !important; }
+ #LookingGlassDebugFlags .lg-debug-flag-button .toggle-switch {
+ background: rgba(255, 255, 255, 0.15); }
+ #LookingGlassDebugFlags .lg-debug-flag-button .toggle-switch:hover {
+ background: rgba(255, 255, 255, 0.2); }
+ #LookingGlassDebugFlags .lg-debug-flag-button .toggle-switch:checked {
+ background: -st-accent-color;
+ color: -st-accent-fg-color; }
+ #LookingGlassDebugFlags .lg-debug-flag-button .toggle-switch:checked:hover {
+ background-color: st-lighten(-st-accent-color, 5%);
+ color: st-lighten(-st-accent-fg-color, 5%); }
+
+.login-dialog,
+.unlock-dialog {
- color: whitesmoke; }
++ color: #fafafb; }
+ .login-dialog .caps-lock-warning-label,
+ .login-dialog .login-dialog-message-warning,
+ .unlock-dialog .caps-lock-warning-label,
+ .unlock-dialog .login-dialog-message-warning {
- color: #f6d32d; }
++ color: #fafafb; }
+ .login-dialog .login-dialog-prompt-layout,
+ .unlock-dialog .login-dialog-prompt-layout {
+ width: 25em;
+ spacing: 9px; }
+
+.login-dialog-button.cancel-button {
+ padding: 9px; }
+
+.login-dialog-button-box {
+ spacing: 12px; }
+
+.conflicting-session-dialog-content {
+ spacing: 20px; }
+ .conflicting-session-dialog-content .conflicting-session-dialog-title {
+ text-align: center;
+ margin-bottom: 5px; }
+ .conflicting-session-dialog-content .conflicting-session-dialog-desc {
+ text-align: center; }
+ .conflicting-session-dialog-content .conflicting-session-dialog-desc-warning {
+ text-align: center;
- color: gainsboro; }
++ color: #cd9309; }
+
+.login-dialog-logo-bin {
+ margin: 3em 0; }
+
+.login-dialog-banner-view {
+ max-width: 25em; }
+ .login-dialog-banner-view .login-dialog-banner {
- color: gainsboro;
++ color: #dedee4; }
+
+.login-dialog-message {
+ text-align: center; }
+
+.login-dialog-message-hint, .login-dialog-message {
- color: whitesmoke;
- background-color: #282828;
++ color: #dedee4;
+ min-height: 2.75em; }
+
+.login-dialog-user-selection-box {
+ padding-top: 4em;
+ padding-bottom: 8em; }
+
+.login-dialog-not-listed-label {
+ padding: 6px; }
+
+.login-dialog-not-listed-button {
- color: whitesmoke;
- box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.5) !important;
- background-color: st-mix(-st-accent-color, rgba(40, 40, 40, 0.25), 5%); }
++ color: #fafafb;
++ background-color: #222226;
+ padding: 0 6px;
+ margin: 6px; }
+ .login-dialog-not-listed-button:focus {
- background-color: st-mix(-st-accent-color, st-lighten(#282828, 7%), 5%); }
++ color: #fafafb;
++ box-shadow: inset 0 0 0 2px st-transparentize(st-mix(-st-accent-color, #ffffff, 60%), 0.2) !important;
++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), rgba(34, 34, 38, 0.25), 5%); }
+ .login-dialog-not-listed-button:focus:hover {
- color: whitesmoke;
- background-color: st-lighten(#282828, 7%); }
++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-lighten(#222226, 7%), 5%); }
+ .login-dialog-not-listed-button:hover {
- color: whitesmoke;
- background-color: st-lighten(#282828, 9%); }
++ color: #fafafb;
++ background-color: st-lighten(#222226, 7%); }
+ .login-dialog-not-listed-button:active {
- background-color: st-lighten(st-lighten(#282828, 9%), 7%); }
++ color: #fafafb;
++ background-color: st-lighten(#222226, 9%); }
+ .login-dialog-not-listed-button:active:hover {
- background-color: st-mix(-st-accent-color, st-lighten(#282828, 9%), 5%); }
++ background-color: st-lighten(st-lighten(#222226, 9%), 7%); }
+ .login-dialog-not-listed-button:active:focus {
- color: darkgray; }
++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-lighten(#222226, 9%), 5%); }
+
+.login-dialog-auth-list-view {
+ -st-vfade-offset: 3em; }
+
+.login-dialog-auth-list {
+ spacing: 6px;
+ margin-left: 2em; }
+
+.login-dialog-auth-list-title {
+ margin-left: 2em; }
+
+.login-dialog-auth-list-item {
+ border-radius: 16px;
+ padding: 4px;
- color: whitesmoke;
- background-color: st-mix(whitesmoke, #282828, 9%);
++ color: #a5a5b7; }
+ .login-dialog-auth-list-item:focus, .login-dialog-auth-list-item:selected {
+ background-color: -st-accent-color;
+ color: -st-accent-fg-color; }
+
+.login-dialog-auth-list-label:ltr {
+ padding-left: 15px;
+ text-align: left; }
+
+.login-dialog-auth-list-label:rtl {
+ padding-right: 15px;
+ text-align: right; }
+
+.login-dialog-user-list-view {
+ width: 25em;
+ -st-vfade-offset: 3em; }
+ .login-dialog-user-list-view .login-dialog-user-list {
+ margin: 0 8px;
+ spacing: 12px; }
+ .login-dialog-user-list-view .login-dialog-user-list .login-dialog-user-list-item {
- color: whitesmoke;
- box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.5) !important;
- background-color: st-mix(-st-accent-color, st-mix(whitesmoke, #282828, 9%), 5%); }
++ color: #fafafb;
++ background-color: st-mix(#fafafb, #222226, 9%);
+ border-radius: 16px;
+ padding: 9px; }
+ .login-dialog-user-list-view .login-dialog-user-list .login-dialog-user-list-item:selected, .login-dialog-user-list-view .login-dialog-user-list .login-dialog-user-list-item:focus {
- background-color: st-mix(-st-accent-color, st-lighten(st-mix(whitesmoke, #282828, 9%), 4%), 5%); }
++ color: #fafafb;
++ box-shadow: inset 0 0 0 2px st-transparentize(st-mix(-st-accent-color, #ffffff, 60%), 0.2) !important;
++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(#fafafb, #222226, 9%), 5%); }
+ .login-dialog-user-list-view .login-dialog-user-list .login-dialog-user-list-item:selected:hover, .login-dialog-user-list-view .login-dialog-user-list .login-dialog-user-list-item:focus:hover {
- color: whitesmoke;
- background-color: st-lighten(st-mix(whitesmoke, #282828, 9%), 4%); }
++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-lighten(st-mix(#fafafb, #222226, 9%), 4%), 5%); }
+ .login-dialog-user-list-view .login-dialog-user-list .login-dialog-user-list-item:hover {
- color: whitesmoke;
- background-color: st-lighten(st-mix(whitesmoke, #282828, 9%), 9%); }
++ color: #fafafb;
++ background-color: st-lighten(st-mix(#fafafb, #222226, 9%), 4%); }
+ .login-dialog-user-list-view .login-dialog-user-list .login-dialog-user-list-item:active {
- background-color: st-lighten(st-lighten(st-mix(whitesmoke, #282828, 9%), 9%), 4%); }
++ color: #fafafb;
++ background-color: st-lighten(st-mix(#fafafb, #222226, 9%), 9%); }
+ .login-dialog-user-list-view .login-dialog-user-list .login-dialog-user-list-item:active:hover {
- background-color: st-mix(-st-accent-color, st-lighten(st-mix(whitesmoke, #282828, 9%), 9%), 5%); }
++ background-color: st-lighten(st-lighten(st-mix(#fafafb, #222226, 9%), 9%), 4%); }
+ .login-dialog-user-list-view .login-dialog-user-list .login-dialog-user-list-item:active:focus {
- background-color: rgba(245, 245, 245, 0.7); }
++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-lighten(st-mix(#fafafb, #222226, 9%), 9%), 5%); }
+ .login-dialog-user-list-view .login-dialog-user-list .login-dialog-user-list-item .user-icon {
+ border: 2px solid transparent; }
+ .login-dialog-user-list-view .login-dialog-user-list .login-dialog-user-list-item .login-dialog-timed-login-indicator {
+ height: 2px;
+ margin-top: 6px;
- background-color: #282828; }
++ background-color: rgba(250, 250, 251, 0.7); }
+ .login-dialog-user-list-view .login-dialog-user-list .login-dialog-user-list-item:logged-in .user-icon {
+ border-color: -st-accent-color; }
+ .login-dialog-user-list-view .login-dialog-user-list .login-dialog-user-list-item:logged-in .user-icon StIcon {
+ background-color: st-transparentize(-st-accent-color, 0.7); }
+
+.unlock-dialog {
+ background-color: transparent; }
+
+.screen-shield-background {
+ background: black;
+ box-shadow: 0 2px 4px rgba(0, 0, 0, 0.6); }
+
+#lockDialogGroup {
- color: whitesmoke;
++ background-color: #222226; }
+
+.unlock-dialog-clock {
- background-color: rgba(53, 53, 53, 0.3); }
++ color: #fafafb;
+ spacing: 2em; }
+ .unlock-dialog-clock .unlock-dialog-clock-time {
+ font-size: 6.546em;
+ font-weight: 800; }
+ .unlock-dialog-clock .unlock-dialog-clock-date {
+ font-weight: 400; }
+ .unlock-dialog-clock .unlock-dialog-clock-hint {
+ margin-top: 2em;
+ padding: 6px 18px;
+ border-radius: 16px;
+ font-weight: bold; }
+
+#unlockDialogNotifications StButton#vhandle, #unlockDialogNotifications StButton#hhandle {
- background-color: rgba(53, 53, 53, 0.5); }
++ background-color: rgba(54, 54, 58, 0.3); }
+ #unlockDialogNotifications StButton#vhandle:hover, #unlockDialogNotifications StButton#vhandle:focus, #unlockDialogNotifications StButton#hhandle:hover, #unlockDialogNotifications StButton#hhandle:focus {
- background-color: rgba(245, 245, 245, 0.1);
- color: whitesmoke;
++ background-color: rgba(54, 54, 58, 0.5); }
+ #unlockDialogNotifications StButton#vhandle:active, #unlockDialogNotifications StButton#hhandle:active {
+ background-color: st-transparentize(-st-accent-color, 0.5); }
+
+.unlock-dialog-notifications-container {
+ margin: 12px;
+ spacing: 6px;
+ width: 25em;
+ background-color: transparent; }
+ .unlock-dialog-notifications-container .summary-notification-stack-scrollview {
+ padding-top: 0;
+ padding-bottom: 0; }
+ .unlock-dialog-notifications-container .notification,
+ .unlock-dialog-notifications-container .unlock-dialog-notification-source {
+ padding: 12px 16px;
+ border: none;
- background-color: rgba(245, 245, 245, 0.2); }
++ background-color: rgba(250, 250, 251, 0.1);
++ color: #fafafb;
+ border-radius: 16px; }
+ .unlock-dialog-notifications-container .notification.critical,
+ .unlock-dialog-notifications-container .unlock-dialog-notification-source.critical {
- color: whitesmoke;
- background-color: rgba(245, 245, 245, 0.1);
++ background-color: rgba(250, 250, 251, 0.2); }
+
+.unlock-dialog-notification-icon {
+ icon-size: 32px; }
+
+.unlock-dialog-notification-label {
+ padding-left: 12px;
+ padding-right: 0; }
+ .unlock-dialog-notification-label:rtl {
+ padding-right: 12px;
+ padding-left: 0; }
+
+.unlock-dialog-notification-count-text {
+ font-weight: bold;
+ padding: 0 12px;
- color: whitesmoke; }
++ color: #fafafb;
++ background-color: rgba(250, 250, 251, 0.1);
+ border-radius: 999px; }
+
+.login-dialog .user-widget .user-widget-label,
+.unlock-dialog .user-widget .user-widget-label {
- background-color: rgba(245, 245, 245, 0.13);
- color: whitesmoke; }
++ color: #fafafb; }
+
+.login-dialog .user-widget .user-icon,
+.unlock-dialog .user-widget .user-icon {
++ background-color: rgba(250, 250, 251, 0.13);
++ color: #fafafb; }
+
+.login-dialog .user-widget.horizontal,
+.unlock-dialog .user-widget.horizontal {
+ spacing: 18px; }
+
+.login-dialog .user-widget.vertical,
+.unlock-dialog .user-widget.vertical {
+ spacing: 24px; }
+ .login-dialog .user-widget.vertical .user-widget-label,
+ .unlock-dialog .user-widget.vertical .user-widget-label {
+ font-weight: 400;
+ font-size: 1.818em;
+ text-align: center;
+ margin-bottom: .75em; }
+ .login-dialog .user-widget.vertical .user-icon,
+ .unlock-dialog .user-widget.vertical .user-icon {
+ icon-size: 160px; }
+ .login-dialog .user-widget.vertical .user-icon StIcon,
+ .unlock-dialog .user-widget.vertical .user-icon StIcon {
+ padding: 30px; }
--- /dev/null
- box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.2) !important;
- background-color: st-mix(-st-accent-color, st-mix(st-mix(#ffffff, #1a1a1a, 9%), #ffffff, 87%), 5%); }
+/* This stylesheet is generated, DO NOT EDIT */
+/* Copyright 2009, 2015 Red Hat, Inc.
+ *
+ * Portions adapted from Mx's data/style/default.css
+ * Copyright 2009 Intel Corporation
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU Lesser General Public License,
+ * version 2.1, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope it will be useful, but WITHOUT ANY
+ * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
+ */
+/* Global Values */
+stage {
+ font-size: 1em;
+ color: #ffffff; }
+
+/* Common Stylings */
+#dash .dash-item-container .show-apps,
+#dash .dash-item-container .overview-tile,
+#dash .dash-item-container .grid-search-result {
+ background: none;
+ box-shadow: none;
+ border: none;
+ border-radius: 0;
+ padding: 0;
+ margin: 0; }
+
+.app-folder-dialog .overview-tile, .app-folder-dialog .grid-search-result, .app-folder, .overview-tile, .grid-search-result, #dash .dash-item-container .show-apps .overview-icon,
+#dash .dash-item-container .overview-tile .overview-icon,
+#dash .dash-item-container .grid-search-result .overview-icon, .list-search-result, .search-provider-icon, .switcher-list .item-box, .audio-device-selection-dialog .audio-selection-box .audio-selection-device {
+ border-radius: 16px;
+ padding: 6px;
+ spacing: 6px;
+ text-align: center;
+ transition-duration: 100ms; }
+
+.login-dialog-user-list-view .login-dialog-user-list .login-dialog-user-list-item, .login-dialog-not-listed-button, .unlock-dialog .button,
+.unlock-dialog .icon-button,
+.unlock-dialog .message .message-header .message-expand-button,
+.message .message-header .unlock-dialog .message-expand-button,
+.unlock-dialog .message .message-header .message-close-button,
+.message .message-header .unlock-dialog .message-close-button,
+.unlock-dialog .screenshot-ui-show-pointer-button, #LookingGlassDialog .notebook-tab, .screenshot-ui-show-pointer-button, .screenshot-ui-type-button, #LookingGlassDebugFlags .lg-debug-flag-button, #LookingGlassPropertyInspector .lg-obj-inspector-close-button,
+#LookingGlassPropertyInspector .lg-obj-inspector-button, #LookingGlassDialog > #Toolbar .lg-toolbar-button, .icon-button, .login-dialog-button.cancel-button, .login-dialog-button.switch-user-button, .login-dialog-button.login-dialog-session-list-button, .message .message-header .message-expand-button,
+.message .message-header .message-close-button, .calendar .calendar-month-header .pager-button, .button {
+ border-radius: 8px;
+ padding: 3px 24px;
+ font-weight: bold;
+ transition: border-width 300ms cubic-bezier(0.25, 0.46, 0.45, 0.94), box-shadow 300ms cubic-bezier(0.25, 0.46, 0.45, 0.94); }
+
+.icon-button, .login-dialog-button.cancel-button, .login-dialog-button.switch-user-button, .login-dialog-button.login-dialog-session-list-button, .screenshot-ui-show-pointer-button, .message .message-header .message-expand-button,
+.message .message-header .message-close-button, .calendar .calendar-month-header .pager-button, .button {
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
+ color: #ffffff;
+ background-color: st-mix(st-mix(#ffffff, #1a1a1a, 9%), #ffffff, 87%); }
+ .icon-button:focus, .login-dialog-button.cancel-button:focus, .login-dialog-button.switch-user-button:focus, .login-dialog-button.login-dialog-session-list-button:focus, .screenshot-ui-show-pointer-button:focus, .message .message-header .message-expand-button:focus,
+ .message .message-header .message-close-button:focus, .calendar .calendar-month-header .pager-button:focus, .button:focus {
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
+ color: #ffffff;
- background-color: st-mix(-st-accent-color, st-mix(st-lighten(st-mix(#ffffff, #1a1a1a, 9%), 4%), #ffffff, 87%), 5%); }
++ box-shadow: inset 0 0 0 2px st-transparentize(st-mix(-st-accent-color, #ffffff, 60%), 0.1) !important;
++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(st-mix(#ffffff, #1a1a1a, 9%), #ffffff, 87%), 5%); }
+ .icon-button:focus:hover, .login-dialog-button.cancel-button:focus:hover, .login-dialog-button.switch-user-button:focus:hover, .login-dialog-button.login-dialog-session-list-button:focus:hover, .screenshot-ui-show-pointer-button:focus:hover, .message .message-header .message-expand-button:focus:hover,
+ .message .message-header .message-close-button:focus:hover, .calendar .calendar-month-header .pager-button:focus:hover, .button:focus:hover {
- background-color: st-mix(-st-accent-color, st-mix(st-lighten(st-mix(#ffffff, #1a1a1a, 9%), 9%), #ffffff, 87%), 5%); }
++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(st-lighten(st-mix(#ffffff, #1a1a1a, 9%), 4%), #ffffff, 87%), 5%); }
+ .icon-button:hover, .login-dialog-button.cancel-button:hover, .login-dialog-button.switch-user-button:hover, .login-dialog-button.login-dialog-session-list-button:hover, .screenshot-ui-show-pointer-button:hover, .message .message-header .message-expand-button:hover,
+ .message .message-header .message-close-button:hover, .calendar .calendar-month-header .pager-button:hover, .button:hover {
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
+ color: #ffffff;
+ background-color: st-mix(st-lighten(st-mix(#ffffff, #1a1a1a, 9%), 4%), #ffffff, 87%); }
+ .icon-button:insensitive, .login-dialog-button.cancel-button:insensitive, .login-dialog-button.switch-user-button:insensitive, .login-dialog-button.login-dialog-session-list-button:insensitive, .screenshot-ui-show-pointer-button:insensitive, .message .message-header .message-expand-button:insensitive,
+ .message .message-header .message-close-button:insensitive, .calendar .calendar-month-header .pager-button:insensitive, .button:insensitive {
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
+ color: st-transparentize(#ffffff, 0.5);
+ background-color: st-darken(st-mix(#ffffff, #1a1a1a, 9%), 3%);
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
+ box-shadow: none;
+ border: none; }
+ .icon-button:selected, .login-dialog-button.cancel-button:selected, .login-dialog-button.switch-user-button:selected, .login-dialog-button.login-dialog-session-list-button:selected, .screenshot-ui-show-pointer-button:selected, .message .message-header .message-expand-button:selected,
+ .message .message-header .message-close-button:selected, .calendar .calendar-month-header .pager-button:selected, .button:selected, .icon-button:active, .login-dialog-button.cancel-button:active, .login-dialog-button.switch-user-button:active, .login-dialog-button.login-dialog-session-list-button:active, .screenshot-ui-show-pointer-button:active, .message .message-header .message-expand-button:active,
+ .message .message-header .message-close-button:active, .calendar .calendar-month-header .pager-button:active, .button:active {
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
+ color: #ffffff;
+ background-color: st-mix(st-lighten(st-mix(#ffffff, #1a1a1a, 9%), 9%), #ffffff, 87%); }
+ .icon-button:selected:hover, .login-dialog-button.cancel-button:selected:hover, .login-dialog-button.switch-user-button:selected:hover, .login-dialog-button.login-dialog-session-list-button:selected:hover, .screenshot-ui-show-pointer-button:selected:hover, .message .message-header .message-expand-button:selected:hover,
+ .message .message-header .message-close-button:selected:hover, .calendar .calendar-month-header .pager-button:selected:hover, .button:selected:hover, .icon-button:active:hover, .login-dialog-button.cancel-button:active:hover, .login-dialog-button.switch-user-button:active:hover, .login-dialog-button.login-dialog-session-list-button:active:hover, .screenshot-ui-show-pointer-button:active:hover, .message .message-header .message-expand-button:active:hover,
+ .message .message-header .message-close-button:active:hover, .calendar .calendar-month-header .pager-button:active:hover, .button:active:hover {
+ background-color: st-lighten(st-lighten(st-mix(#ffffff, #1a1a1a, 9%), 9%), 4%); }
+ .icon-button:selected:focus, .login-dialog-button.cancel-button:selected:focus, .login-dialog-button.switch-user-button:selected:focus, .login-dialog-button.login-dialog-session-list-button:selected:focus, .screenshot-ui-show-pointer-button:selected:focus, .message .message-header .message-expand-button:selected:focus,
+ .message .message-header .message-close-button:selected:focus, .calendar .calendar-month-header .pager-button:selected:focus, .button:selected:focus, .icon-button:active:focus, .login-dialog-button.cancel-button:active:focus, .login-dialog-button.switch-user-button:active:focus, .login-dialog-button.login-dialog-session-list-button:active:focus, .screenshot-ui-show-pointer-button:active:focus, .message .message-header .message-expand-button:active:focus,
+ .message .message-header .message-close-button:active:focus, .calendar .calendar-month-header .pager-button:active:focus, .button:active:focus {
- box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.2) !important;
- background-color: st-mix(-st-accent-color, rgba(26, 26, 26, 0.25), 5%); }
++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(st-lighten(st-mix(#ffffff, #1a1a1a, 9%), 9%), #ffffff, 87%), 5%); }
+ .icon-button:checked, .login-dialog-button.cancel-button:checked, .login-dialog-button.switch-user-button:checked, .login-dialog-button.login-dialog-session-list-button:checked, .screenshot-ui-show-pointer-button:checked, .message .message-header .message-expand-button:checked,
+ .message .message-header .message-close-button:checked, .calendar .calendar-month-header .pager-button:checked, .button:checked {
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
+ color: #ffffff;
+ background-color: st-mix(st-lighten(st-mix(#ffffff, #1a1a1a, 9%), 8%), #ffffff, 87%); }
+ .icon-button:checked:hover, .login-dialog-button.cancel-button:checked:hover, .login-dialog-button.switch-user-button:checked:hover, .login-dialog-button.login-dialog-session-list-button:checked:hover, .screenshot-ui-show-pointer-button:checked:hover, .message .message-header .message-expand-button:checked:hover,
+ .message .message-header .message-close-button:checked:hover, .calendar .calendar-month-header .pager-button:checked:hover, .button:checked:hover {
+ background-color: st-lighten(st-lighten(st-mix(#ffffff, #1a1a1a, 9%), 8%), 4%); }
+ .icon-button:checked:active, .login-dialog-button.cancel-button:checked:active, .login-dialog-button.switch-user-button:checked:active, .login-dialog-button.login-dialog-session-list-button:checked:active, .screenshot-ui-show-pointer-button:checked:active, .message .message-header .message-expand-button:checked:active,
+ .message .message-header .message-close-button:checked:active, .calendar .calendar-month-header .pager-button:checked:active, .button:checked:active {
+ background-color: st-lighten(st-lighten(st-mix(#ffffff, #1a1a1a, 9%), 8%), 9%); }
+
+.calendar .calendar-day-heading, .calendar .calendar-day, .calendar .calendar-month-header .calendar-month-label, .icon-button.flat, .flat.login-dialog-button.cancel-button, .flat.login-dialog-button.switch-user-button, .flat.login-dialog-button.login-dialog-session-list-button, .flat.screenshot-ui-show-pointer-button, .message .message-header .flat.message-expand-button,
+.message .message-header .flat.message-close-button, .calendar .calendar-month-header .pager-button, .button.flat {
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
+ color: #ffffff;
+ background-color: #1a1a1a;
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
+ box-shadow: none;
+ border: none; }
+ .calendar .calendar-day-heading:focus, .calendar .calendar-day:focus, .calendar .calendar-month-header .calendar-month-label:focus, .icon-button.flat:focus, .flat.login-dialog-button.cancel-button:focus, .flat.login-dialog-button.switch-user-button:focus, .flat.login-dialog-button.login-dialog-session-list-button:focus, .flat.screenshot-ui-show-pointer-button:focus, .message .message-header .flat.message-expand-button:focus,
+ .message .message-header .flat.message-close-button:focus, .calendar .calendar-month-header .pager-button:focus, .button.flat:focus {
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
+ color: #ffffff;
- background-color: st-mix(-st-accent-color, st-mix(st-lighten(#1a1a1a, 7%), #ffffff, 87%), 5%); }
++ box-shadow: inset 0 0 0 2px st-transparentize(st-mix(-st-accent-color, #ffffff, 60%), 0.1) !important;
++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), rgba(26, 26, 26, 0.25), 5%); }
+ .calendar .calendar-day-heading:focus:hover, .calendar .calendar-day:focus:hover, .calendar .calendar-month-header .calendar-month-label:focus:hover, .icon-button.flat:focus:hover, .flat.login-dialog-button.cancel-button:focus:hover, .flat.login-dialog-button.switch-user-button:focus:hover, .flat.login-dialog-button.login-dialog-session-list-button:focus:hover, .flat.screenshot-ui-show-pointer-button:focus:hover, .message .message-header .flat.message-expand-button:focus:hover,
+ .message .message-header .flat.message-close-button:focus:hover, .calendar .calendar-month-header .pager-button:focus:hover, .button.flat:focus:hover {
- background-color: st-mix(-st-accent-color, st-mix(st-lighten(#1a1a1a, 9%), #ffffff, 87%), 5%); }
++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(st-lighten(#1a1a1a, 7%), #ffffff, 87%), 5%); }
+ .calendar .calendar-day-heading:hover, .calendar .calendar-day:hover, .calendar .calendar-month-header .calendar-month-label:hover, .icon-button.flat:hover, .flat.login-dialog-button.cancel-button:hover, .flat.login-dialog-button.switch-user-button:hover, .flat.login-dialog-button.login-dialog-session-list-button:hover, .flat.screenshot-ui-show-pointer-button:hover, .message .message-header .flat.message-expand-button:hover,
+ .message .message-header .flat.message-close-button:hover, .calendar .calendar-month-header .pager-button:hover, .button.flat:hover {
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
+ color: #ffffff;
+ background-color: st-mix(st-lighten(#1a1a1a, 7%), #ffffff, 87%); }
+ .calendar .calendar-day-heading:insensitive, .calendar .calendar-day:insensitive, .calendar .calendar-month-header .calendar-month-label:insensitive, .icon-button.flat:insensitive, .flat.login-dialog-button.cancel-button:insensitive, .flat.login-dialog-button.switch-user-button:insensitive, .flat.login-dialog-button.login-dialog-session-list-button:insensitive, .flat.screenshot-ui-show-pointer-button:insensitive, .message .message-header .flat.message-expand-button:insensitive,
+ .message .message-header .flat.message-close-button:insensitive, .calendar .calendar-month-header .pager-button:insensitive, .button.flat:insensitive {
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
+ color: st-transparentize(#ffffff, 0.5);
+ background-color: #1a1a1a;
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
+ box-shadow: none;
+ border: none; }
+ .calendar .calendar-day-heading:selected, .calendar .calendar-day:selected, .calendar .calendar-month-header .calendar-month-label:selected, .icon-button.flat:selected, .flat.login-dialog-button.cancel-button:selected, .flat.login-dialog-button.switch-user-button:selected, .flat.login-dialog-button.login-dialog-session-list-button:selected, .flat.screenshot-ui-show-pointer-button:selected, .message .message-header .flat.message-expand-button:selected,
+ .message .message-header .flat.message-close-button:selected, .calendar .calendar-month-header .pager-button:selected, .button.flat:selected, .calendar .calendar-day-heading:active, .calendar .calendar-day:active, .calendar .calendar-month-header .calendar-month-label:active, .icon-button.flat:active, .flat.login-dialog-button.cancel-button:active, .flat.login-dialog-button.switch-user-button:active, .flat.login-dialog-button.login-dialog-session-list-button:active, .flat.screenshot-ui-show-pointer-button:active, .message .message-header .flat.message-expand-button:active,
+ .message .message-header .flat.message-close-button:active, .calendar .calendar-month-header .pager-button:active, .button.flat:active {
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
+ color: #ffffff;
+ background-color: st-mix(st-lighten(#1a1a1a, 9%), #ffffff, 87%); }
+ .calendar .calendar-day-heading:selected:hover, .calendar .calendar-day:selected:hover, .calendar .calendar-month-header .calendar-month-label:selected:hover, .icon-button.flat:selected:hover, .flat.login-dialog-button.cancel-button:selected:hover, .flat.login-dialog-button.switch-user-button:selected:hover, .flat.login-dialog-button.login-dialog-session-list-button:selected:hover, .flat.screenshot-ui-show-pointer-button:selected:hover, .message .message-header .flat.message-expand-button:selected:hover,
+ .message .message-header .flat.message-close-button:selected:hover, .calendar .calendar-month-header .pager-button:selected:hover, .button.flat:selected:hover, .calendar .calendar-day-heading:active:hover, .calendar .calendar-day:active:hover, .calendar .calendar-month-header .calendar-month-label:active:hover, .icon-button.flat:active:hover, .flat.login-dialog-button.cancel-button:active:hover, .flat.login-dialog-button.switch-user-button:active:hover, .flat.login-dialog-button.login-dialog-session-list-button:active:hover, .flat.screenshot-ui-show-pointer-button:active:hover, .message .message-header .flat.message-expand-button:active:hover,
+ .message .message-header .flat.message-close-button:active:hover, .calendar .calendar-month-header .pager-button:active:hover, .button.flat:active:hover {
+ background-color: st-lighten(st-lighten(#1a1a1a, 9%), 7%); }
+ .calendar .calendar-day-heading:selected:focus, .calendar .calendar-day:selected:focus, .calendar .calendar-month-header .calendar-month-label:selected:focus, .icon-button.flat:selected:focus, .flat.login-dialog-button.cancel-button:selected:focus, .flat.login-dialog-button.switch-user-button:selected:focus, .flat.login-dialog-button.login-dialog-session-list-button:selected:focus, .flat.screenshot-ui-show-pointer-button:selected:focus, .message .message-header .flat.message-expand-button:selected:focus,
+ .message .message-header .flat.message-close-button:selected:focus, .calendar .calendar-month-header .pager-button:selected:focus, .button.flat:selected:focus, .calendar .calendar-day-heading:active:focus, .calendar .calendar-day:active:focus, .calendar .calendar-month-header .calendar-month-label:active:focus, .icon-button.flat:active:focus, .flat.login-dialog-button.cancel-button:active:focus, .flat.login-dialog-button.switch-user-button:active:focus, .flat.login-dialog-button.login-dialog-session-list-button:active:focus, .flat.screenshot-ui-show-pointer-button:active:focus, .message .message-header .flat.message-expand-button:active:focus,
+ .message .message-header .flat.message-close-button:active:focus, .calendar .calendar-month-header .pager-button:active:focus, .button.flat:active:focus {
- .keyboard-brightness-level .button:checked, .quick-menu-toggle .quick-toggle-arrow:checked, .quick-toggle:checked, .calendar .calendar-day.calendar-today, .icon-button.default, .default.login-dialog-button.cancel-button, .default.login-dialog-button.switch-user-button, .default.login-dialog-button.login-dialog-session-list-button, .default.screenshot-ui-show-pointer-button, .message .message-header .default.message-expand-button,
++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(st-lighten(#1a1a1a, 9%), #ffffff, 87%), 5%); }
+ .calendar .calendar-day-heading:checked, .calendar .calendar-day:checked, .calendar .calendar-month-header .calendar-month-label:checked, .icon-button.flat:checked, .flat.login-dialog-button.cancel-button:checked, .flat.login-dialog-button.switch-user-button:checked, .flat.login-dialog-button.login-dialog-session-list-button:checked, .flat.screenshot-ui-show-pointer-button:checked, .message .message-header .flat.message-expand-button:checked,
+ .message .message-header .flat.message-close-button:checked, .calendar .calendar-month-header .pager-button:checked, .button.flat:checked {
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
+ color: #ffffff;
+ background-color: st-mix(st-lighten(#1a1a1a, 8%), #ffffff, 87%); }
+ .calendar .calendar-day-heading:checked:hover, .calendar .calendar-day:checked:hover, .calendar .calendar-month-header .calendar-month-label:checked:hover, .icon-button.flat:checked:hover, .flat.login-dialog-button.cancel-button:checked:hover, .flat.login-dialog-button.switch-user-button:checked:hover, .flat.login-dialog-button.login-dialog-session-list-button:checked:hover, .flat.screenshot-ui-show-pointer-button:checked:hover, .message .message-header .flat.message-expand-button:checked:hover,
+ .message .message-header .flat.message-close-button:checked:hover, .calendar .calendar-month-header .pager-button:checked:hover, .button.flat:checked:hover {
+ background-color: st-lighten(st-lighten(#1a1a1a, 8%), 7%); }
+ .calendar .calendar-day-heading:checked:active, .calendar .calendar-day:checked:active, .calendar .calendar-month-header .calendar-month-label:checked:active, .icon-button.flat:checked:active, .flat.login-dialog-button.cancel-button:checked:active, .flat.login-dialog-button.switch-user-button:checked:active, .flat.login-dialog-button.login-dialog-session-list-button:checked:active, .flat.screenshot-ui-show-pointer-button:checked:active, .message .message-header .flat.message-expand-button:checked:active,
+ .message .message-header .flat.message-close-button:checked:active, .calendar .calendar-month-header .pager-button:checked:active, .button.flat:checked:active {
+ background-color: st-lighten(st-lighten(#1a1a1a, 8%), 9%); }
+
- .keyboard-brightness-level .button:focus:checked, .quick-menu-toggle .quick-toggle-arrow:focus:checked, .quick-toggle:focus:checked, .calendar .calendar-day.calendar-today:focus, .icon-button.default:focus, .default.login-dialog-button.cancel-button:focus, .default.login-dialog-button.switch-user-button:focus, .default.login-dialog-button.login-dialog-session-list-button:focus, .default.screenshot-ui-show-pointer-button:focus, .message .message-header .default.message-expand-button:focus,
++.keyboard-brightness-level .button:checked, .quick-toggle:checked, .calendar .calendar-day.calendar-today, .icon-button.default, .default.login-dialog-button.cancel-button, .default.login-dialog-button.switch-user-button, .default.login-dialog-button.login-dialog-session-list-button, .default.screenshot-ui-show-pointer-button, .message .message-header .default.message-expand-button,
+.message .message-header .default.message-close-button, .calendar .calendar-month-header .default.pager-button, .button.default {
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
+ box-shadow: none;
+ border: none;
+ color: -st-accent-fg-color;
+ background-color: st-mix(-st-accent-color, #ffffff, 87%); }
- box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.2) !important;
- box-shadow: inset 0 0 0 2px st-lighten(-st-accent-color, 30%) !important;
- background-color: st-mix(-st-accent-color, st-mix(-st-accent-color, #ffffff, 87%), 5%); }
- .keyboard-brightness-level .button:focus:hover:checked, .quick-menu-toggle .quick-toggle-arrow:focus:hover:checked, .quick-toggle:focus:hover:checked, .calendar .calendar-day.calendar-today:focus:hover, .icon-button.default:focus:hover, .default.login-dialog-button.cancel-button:focus:hover, .default.login-dialog-button.switch-user-button:focus:hover, .default.login-dialog-button.login-dialog-session-list-button:focus:hover, .default.screenshot-ui-show-pointer-button:focus:hover, .message .message-header .default.message-expand-button:focus:hover,
++ .keyboard-brightness-level .button:focus:checked, .quick-toggle:focus:checked, .calendar .calendar-day.calendar-today:focus, .icon-button.default:focus, .default.login-dialog-button.cancel-button:focus, .default.login-dialog-button.switch-user-button:focus, .default.login-dialog-button.login-dialog-session-list-button:focus, .default.screenshot-ui-show-pointer-button:focus, .message .message-header .default.message-expand-button:focus,
+ .message .message-header .default.message-close-button:focus, .calendar .calendar-month-header .default.pager-button:focus, .button.default:focus {
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
+ box-shadow: none;
+ border: none;
+ color: -st-accent-fg-color;
- background-color: st-mix(-st-accent-color, st-mix(st-lighten(-st-accent-color, 4%), #ffffff, 87%), 5%); }
- .keyboard-brightness-level .button:hover:checked, .quick-menu-toggle .quick-toggle-arrow:hover:checked, .quick-toggle:hover:checked, .calendar .calendar-day.calendar-today:hover, .icon-button.default:hover, .default.login-dialog-button.cancel-button:hover, .default.login-dialog-button.switch-user-button:hover, .default.login-dialog-button.login-dialog-session-list-button:hover, .default.screenshot-ui-show-pointer-button:hover, .message .message-header .default.message-expand-button:hover,
++ box-shadow: inset 0 0 0 2px st-transparentize(st-mix(-st-accent-color, #ffffff, 60%), 0.1) !important;
++ box-shadow: inset 0 0 0 2px st-transparentize(st-lighten(-st-accent-color, 30%), 0.1) !important;
++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(-st-accent-color, #ffffff, 87%), 5%); }
++ .keyboard-brightness-level .button:focus:hover:checked, .quick-toggle:focus:hover:checked, .calendar .calendar-day.calendar-today:focus:hover, .icon-button.default:focus:hover, .default.login-dialog-button.cancel-button:focus:hover, .default.login-dialog-button.switch-user-button:focus:hover, .default.login-dialog-button.login-dialog-session-list-button:focus:hover, .default.screenshot-ui-show-pointer-button:focus:hover, .message .message-header .default.message-expand-button:focus:hover,
+ .message .message-header .default.message-close-button:focus:hover, .calendar .calendar-month-header .default.pager-button:focus:hover, .button.default:focus:hover {
- .keyboard-brightness-level .button:insensitive:checked, .quick-menu-toggle .quick-toggle-arrow:insensitive:checked, .quick-toggle:insensitive:checked, .calendar .calendar-day.calendar-today:insensitive, .icon-button.default:insensitive, .default.login-dialog-button.cancel-button:insensitive, .default.login-dialog-button.switch-user-button:insensitive, .default.login-dialog-button.login-dialog-session-list-button:insensitive, .default.screenshot-ui-show-pointer-button:insensitive, .message .message-header .default.message-expand-button:insensitive,
++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(st-lighten(-st-accent-color, 4%), #ffffff, 87%), 5%); }
++ .keyboard-brightness-level .button:hover:checked, .quick-toggle:hover:checked, .calendar .calendar-day.calendar-today:hover, .icon-button.default:hover, .default.login-dialog-button.cancel-button:hover, .default.login-dialog-button.switch-user-button:hover, .default.login-dialog-button.login-dialog-session-list-button:hover, .default.screenshot-ui-show-pointer-button:hover, .message .message-header .default.message-expand-button:hover,
+ .message .message-header .default.message-close-button:hover, .calendar .calendar-month-header .default.pager-button:hover, .button.default:hover {
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
+ box-shadow: none;
+ border: none;
+ color: -st-accent-fg-color;
+ background-color: st-mix(st-lighten(-st-accent-color, 4%), #ffffff, 87%); }
- .keyboard-brightness-level .button:active:checked, .quick-menu-toggle .quick-toggle-arrow:active:checked, .quick-toggle:active:checked, .calendar .calendar-day.calendar-today:active, .icon-button.default:active, .default.login-dialog-button.cancel-button:active, .default.login-dialog-button.switch-user-button:active, .default.login-dialog-button.login-dialog-session-list-button:active, .default.screenshot-ui-show-pointer-button:active, .message .message-header .default.message-expand-button:active,
++ .keyboard-brightness-level .button:insensitive:checked, .quick-toggle:insensitive:checked, .calendar .calendar-day.calendar-today:insensitive, .icon-button.default:insensitive, .default.login-dialog-button.cancel-button:insensitive, .default.login-dialog-button.switch-user-button:insensitive, .default.login-dialog-button.login-dialog-session-list-button:insensitive, .default.screenshot-ui-show-pointer-button:insensitive, .message .message-header .default.message-expand-button:insensitive,
+ .message .message-header .default.message-close-button:insensitive, .calendar .calendar-month-header .default.pager-button:insensitive, .button.default:insensitive {
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
+ box-shadow: none;
+ border: none;
+ color: st-transparentize(-st-accent-fg-color, 0.5);
+ background-color: st-darken(-st-accent-color, 3%);
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
+ box-shadow: none;
+ border: none; }
- .keyboard-brightness-level .button:active:hover:checked, .quick-menu-toggle .quick-toggle-arrow:active:hover:checked, .quick-toggle:active:hover:checked, .calendar .calendar-day.calendar-today:active:hover, .icon-button.default:active:hover, .default.login-dialog-button.cancel-button:active:hover, .default.login-dialog-button.switch-user-button:active:hover, .default.login-dialog-button.login-dialog-session-list-button:active:hover, .default.screenshot-ui-show-pointer-button:active:hover, .message .message-header .default.message-expand-button:active:hover,
++ .keyboard-brightness-level .button:active:checked, .quick-toggle:active:checked, .calendar .calendar-day.calendar-today:active, .icon-button.default:active, .default.login-dialog-button.cancel-button:active, .default.login-dialog-button.switch-user-button:active, .default.login-dialog-button.login-dialog-session-list-button:active, .default.screenshot-ui-show-pointer-button:active, .message .message-header .default.message-expand-button:active,
+ .message .message-header .default.message-close-button:active, .calendar .calendar-month-header .default.pager-button:active, .button.default:active {
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
+ box-shadow: none;
+ border: none;
+ color: -st-accent-fg-color;
+ background-color: st-mix(st-lighten(-st-accent-color, 9%), #ffffff, 87%); }
- .keyboard-brightness-level .button:active:focus:checked, .quick-menu-toggle .quick-toggle-arrow:active:focus:checked, .quick-toggle:active:focus:checked, .calendar .calendar-day.calendar-today:active:focus, .icon-button.default:active:focus, .default.login-dialog-button.cancel-button:active:focus, .default.login-dialog-button.switch-user-button:active:focus, .default.login-dialog-button.login-dialog-session-list-button:active:focus, .default.screenshot-ui-show-pointer-button:active:focus, .message .message-header .default.message-expand-button:active:focus,
++ .keyboard-brightness-level .button:active:hover:checked, .quick-toggle:active:hover:checked, .calendar .calendar-day.calendar-today:active:hover, .icon-button.default:active:hover, .default.login-dialog-button.cancel-button:active:hover, .default.login-dialog-button.switch-user-button:active:hover, .default.login-dialog-button.login-dialog-session-list-button:active:hover, .default.screenshot-ui-show-pointer-button:active:hover, .message .message-header .default.message-expand-button:active:hover,
+ .message .message-header .default.message-close-button:active:hover, .calendar .calendar-month-header .default.pager-button:active:hover, .button.default:active:hover {
+ background-color: st-lighten(st-lighten(-st-accent-color, 9%), 4%); }
- background-color: st-mix(-st-accent-color, st-mix(st-lighten(-st-accent-color, 9%), #ffffff, 87%), 5%); }
++ .keyboard-brightness-level .button:active:focus:checked, .quick-toggle:active:focus:checked, .calendar .calendar-day.calendar-today:active:focus, .icon-button.default:active:focus, .default.login-dialog-button.cancel-button:active:focus, .default.login-dialog-button.switch-user-button:active:focus, .default.login-dialog-button.login-dialog-session-list-button:active:focus, .default.screenshot-ui-show-pointer-button:active:focus, .message .message-header .default.message-expand-button:active:focus,
+ .message .message-header .default.message-close-button:active:focus, .calendar .calendar-month-header .default.pager-button:active:focus, .button.default:active:focus {
- background-color: st-mix(-st-accent-color, st-mix(st-lighten(#1a1a1a, 9%), #ffffff, 87%), 5%); }
++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(st-lighten(-st-accent-color, 9%), #ffffff, 87%), 5%); }
+
+.popup-sub-menu .popup-menu-item, .popup-menu-item {
+ font-weight: normal;
+ spacing: 6px;
+ transition-duration: 100ms;
+ padding: 9px 12px; }
+
+#LookingGlassExtensions .lg-extension, #LookingGlassWindows .lg-window, .calendar, .datemenu-today-button, .quick-toggle-menu, .message, .events-button,
+.world-clocks-button,
+.weather-button {
+ border-radius: 12px;
+ padding: 0.818em;
+ margin: 4px;
+ background-color: #1a1a1a;
+ box-shadow: 0 1px 2px 0 transparent;
+ border: 1px solid #1a1a1a;
+ border-color: transparent;
+ box-shadow: none; }
+
+.quick-toggle-menu, .message, .events-button,
+.world-clocks-button,
+.weather-button {
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
+ color: #ffffff;
+ background-color: st-mix(#1a1a1a, #ffffff, 87%); }
+ .quick-toggle-menu:hover, .message:hover, .events-button:hover,
+ .world-clocks-button:hover,
+ .weather-button:hover {
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
+ color: #ffffff;
+ background-color: st-mix(st-lighten(#1a1a1a, 4%), #ffffff, 87%); }
+ .quick-toggle-menu:active, .message:active, .events-button:active,
+ .world-clocks-button:active,
+ .weather-button:active {
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
+ color: #ffffff;
+ background-color: st-mix(st-lighten(#1a1a1a, 9%), #ffffff, 87%); }
+ .quick-toggle-menu:active:hover, .message:active:hover, .events-button:active:hover,
+ .world-clocks-button:active:hover,
+ .weather-button:active:hover {
+ background-color: st-lighten(st-lighten(#1a1a1a, 9%), 4%); }
+ .quick-toggle-menu:active:focus, .message:active:focus, .events-button:active:focus,
+ .world-clocks-button:active:focus,
+ .weather-button:active:focus {
- box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.2) !important;
- background-color: st-mix(-st-accent-color, st-mix(#1a1a1a, #ffffff, 87%), 5%); }
++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(st-lighten(#1a1a1a, 9%), #ffffff, 87%), 5%); }
+ .quick-toggle-menu:focus, .message:focus, .events-button:focus,
+ .world-clocks-button:focus,
+ .weather-button:focus {
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
+ color: #ffffff;
- background-color: st-mix(-st-accent-color, st-mix(st-lighten(#1a1a1a, 4%), #ffffff, 87%), 5%); }
++ box-shadow: inset 0 0 0 2px st-transparentize(st-mix(-st-accent-color, #ffffff, 60%), 0.1) !important;
++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(#1a1a1a, #ffffff, 87%), 5%); }
+ .quick-toggle-menu:focus:hover, .message:focus:hover, .events-button:focus:hover,
+ .world-clocks-button:focus:hover,
+ .weather-button:focus:hover {
- background-color: st-mix(-st-accent-color, st-mix(st-lighten(#1a1a1a, 9%), #ffffff, 87%), 5%); }
++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(st-lighten(#1a1a1a, 4%), #ffffff, 87%), 5%); }
+ .quick-toggle-menu:insensitive, .message:insensitive, .events-button:insensitive,
+ .world-clocks-button:insensitive,
+ .weather-button:insensitive {
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
+ color: st-transparentize(#ffffff, 0.5);
+ background-color: st-darken(#1a1a1a, 3%);
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
+ box-shadow: none;
+ border: none; }
+
+.calendar, .datemenu-today-button {
+ border: 1px solid transparent !important;
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
+ background-color: transparent;
+ border-color: transparent;
+ box-shadow: none; }
+ .calendar:insensitive, .datemenu-today-button:insensitive {
+ background-color: transparent !important; }
+ .calendar:hover, .datemenu-today-button:hover {
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
+ color: #ffffff;
+ background-color: st-mix(st-lighten(#1a1a1a, 7%), #ffffff, 87%); }
+ .calendar:active, .datemenu-today-button:active {
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
+ color: #ffffff;
+ background-color: st-mix(st-lighten(#1a1a1a, 9%), #ffffff, 87%); }
+ .calendar:active:hover, .datemenu-today-button:active:hover {
+ background-color: st-lighten(st-lighten(#1a1a1a, 9%), 7%); }
+ .calendar:active:focus, .datemenu-today-button:active:focus {
- box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.2) !important;
- background-color: st-mix(-st-accent-color, st-mix(#1a1a1a, #ffffff, 87%), 5%); }
++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(st-lighten(#1a1a1a, 9%), #ffffff, 87%), 5%); }
+ .calendar:focus, .datemenu-today-button:focus {
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
+ color: #ffffff;
- background-color: st-mix(-st-accent-color, st-mix(st-lighten(#1a1a1a, 4%), #ffffff, 87%), 5%); }
++ box-shadow: inset 0 0 0 2px st-transparentize(st-mix(-st-accent-color, #ffffff, 60%), 0.1) !important;
++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(#1a1a1a, #ffffff, 87%), 5%); }
+ .calendar:focus:hover, .datemenu-today-button:focus:hover {
- box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.2) !important;
- background-color: st-mix(-st-accent-color, #2e2e2e, 5%);
++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(st-lighten(#1a1a1a, 4%), #ffffff, 87%), 5%); }
+ .calendar:insensitive, .datemenu-today-button:insensitive {
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
+ color: st-transparentize(#ffffff, 0.5);
+ background-color: st-darken(#1a1a1a, 3%);
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
+ box-shadow: none;
+ border: none; }
+
+.unlock-dialog .login-dialog-prompt-entry, .login-dialog .login-dialog-prompt-entry, .app-folder-dialog .folder-name-container .folder-name-entry, .search-entry, .lg-dialog StEntry, StEntry {
+ border-radius: 8px;
+ padding: 9px 9px;
+ selection-background-color: st-transparentize(-st-accent-color, 0.7);
+ selected-color: #ffffff; }
+
+StEntry {
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
+ background-color: #2e2e2e;
+ color: rgba(255, 255, 255, 0.7); }
+ StEntry:hover {
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
+ background-color: #383838;
+ color: #ffffff; }
+ StEntry:focus {
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
- box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.2) !important;
- background-color: st-mix(-st-accent-color, st-mix(rgba(255, 255, 255, 0.15), #ffffff, 87%), 5%); }
++ box-shadow: inset 0 0 0 2px st-transparentize(st-mix(-st-accent-color, #ffffff, 60%), 0.1) !important;
++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), #2e2e2e, 5%);
+ color: #ffffff; }
+ StEntry:insensitive {
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
+ background-color: #262626;
+ color: rgba(255, 255, 255, 0.5); }
+ StEntry StLabel.hint-text {
+ color: rgba(255, 255, 255, 0.7); }
+
+.notification-button, .message .message-header .message-expand-button,
+.message .message-header .message-close-button {
+ font-weight: bold;
+ padding: 6px 12px;
+ border-radius: 8px;
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
+ color: #ffffff;
+ background-color: st-mix(rgba(255, 255, 255, 0.15), #ffffff, 87%); }
+ .notification-button:focus, .message .message-header .message-expand-button:focus,
+ .message .message-header .message-close-button:focus {
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
+ color: #ffffff;
- background-color: st-mix(-st-accent-color, st-mix(rgba(255, 255, 255, 0.3), #ffffff, 87%), 5%); }
++ box-shadow: inset 0 0 0 2px st-transparentize(st-mix(-st-accent-color, #ffffff, 60%), 0.1) !important;
++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(rgba(255, 255, 255, 0.15), #ffffff, 87%), 5%); }
+ .notification-button:focus:hover, .message .message-header .message-expand-button:focus:hover,
+ .message .message-header .message-close-button:focus:hover {
- background-color: st-mix(-st-accent-color, st-mix(rgba(255, 255, 255, 0.2), #ffffff, 87%), 5%); }
++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(rgba(255, 255, 255, 0.3), #ffffff, 87%), 5%); }
+ .notification-button:hover, .message .message-header .message-expand-button:hover,
+ .message .message-header .message-close-button:hover {
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
+ color: #ffffff;
+ background-color: st-mix(rgba(255, 255, 255, 0.3), #ffffff, 87%); }
+ .notification-button:active, .message .message-header .message-expand-button:active,
+ .message .message-header .message-close-button:active {
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
+ color: #ffffff;
+ background-color: st-mix(rgba(255, 255, 255, 0.2), #ffffff, 87%); }
+ .notification-button:active:hover, .message .message-header .message-expand-button:active:hover,
+ .message .message-header .message-close-button:active:hover {
+ background-color: rgba(255, 255, 255, 0.2); }
+ .notification-button:active:focus, .message .message-header .message-expand-button:active:focus,
+ .message .message-header .message-close-button:active:focus {
- box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.2) !important;
- background-color: st-mix(-st-accent-color, st-mix(rgba(255, 255, 255, 0.1), #ffffff, 87%), 5%); }
++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(rgba(255, 255, 255, 0.2), #ffffff, 87%), 5%); }
+ .notification-button:checked, .message .message-header .message-expand-button:checked,
+ .message .message-header .message-close-button:checked {
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
+ color: #ffffff;
+ background-color: st-mix(st-lighten(st-mix(#ffffff, #1a1a1a, 9%), 8%), #ffffff, 87%); }
+ .notification-button:checked:hover, .message .message-header .message-expand-button:checked:hover,
+ .message .message-header .message-close-button:checked:hover {
+ background-color: st-lighten(st-lighten(st-mix(#ffffff, #1a1a1a, 9%), 8%), 4%); }
+ .notification-button:checked:active, .message .message-header .message-expand-button:checked:active,
+ .message .message-header .message-close-button:checked:active {
+ background-color: st-lighten(st-lighten(st-mix(#ffffff, #1a1a1a, 9%), 8%), 9%); }
+ .notification-button:insensitive, .message .message-header .message-expand-button:insensitive,
+ .message .message-header .message-close-button:insensitive {
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
+ color: st-transparentize(#ffffff, 0.5);
+ background-color: rgba(255, 255, 255, 0.1);
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
+ box-shadow: none;
+ border: none; }
+
+.modal-dialog .modal-dialog-button-box .modal-dialog-button {
+ font-weight: bold;
+ padding: 12px;
+ border-radius: 12px;
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
+ color: #ffffff;
+ background-color: st-mix(rgba(255, 255, 255, 0.1), #ffffff, 87%); }
+ .modal-dialog .modal-dialog-button-box .modal-dialog-button:focus {
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
+ color: #ffffff;
- background-color: st-mix(-st-accent-color, st-mix(rgba(255, 255, 255, 0.13), #ffffff, 87%), 5%); }
++ box-shadow: inset 0 0 0 2px st-transparentize(st-mix(-st-accent-color, #ffffff, 60%), 0.1) !important;
++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(rgba(255, 255, 255, 0.1), #ffffff, 87%), 5%); }
+ .modal-dialog .modal-dialog-button-box .modal-dialog-button:focus:hover {
- background-color: st-mix(-st-accent-color, st-mix(rgba(255, 255, 255, 0.16), #ffffff, 87%), 5%); }
++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(rgba(255, 255, 255, 0.13), #ffffff, 87%), 5%); }
+ .modal-dialog .modal-dialog-button-box .modal-dialog-button:hover {
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
+ color: #ffffff;
+ background-color: st-mix(rgba(255, 255, 255, 0.13), #ffffff, 87%); }
+ .modal-dialog .modal-dialog-button-box .modal-dialog-button:active {
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
+ color: #ffffff;
+ background-color: st-mix(rgba(255, 255, 255, 0.16), #ffffff, 87%); }
+ .modal-dialog .modal-dialog-button-box .modal-dialog-button:active:hover {
+ background-color: rgba(255, 255, 255, 0.19); }
+ .modal-dialog .modal-dialog-button-box .modal-dialog-button:active:focus {
- .conflicting-session-dialog-content .conflicting-session-dialog-title, .message-dialog-content .message-dialog-title, .message-list .message-list-placeholder, .datemenu-today-button .date-label {
++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(rgba(255, 255, 255, 0.16), #ffffff, 87%), 5%); }
+ .modal-dialog .modal-dialog-button-box .modal-dialog-button:checked {
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
+ color: #ffffff;
+ background-color: st-mix(st-lighten(st-mix(#ffffff, #1a1a1a, 9%), 8%), #ffffff, 87%); }
+ .modal-dialog .modal-dialog-button-box .modal-dialog-button:checked:hover {
+ background-color: st-lighten(st-lighten(st-mix(#ffffff, #1a1a1a, 9%), 8%), 4%); }
+ .modal-dialog .modal-dialog-button-box .modal-dialog-button:checked:active {
+ background-color: st-lighten(st-lighten(st-mix(#ffffff, #1a1a1a, 9%), 8%), 9%); }
+ .modal-dialog .modal-dialog-button-box .modal-dialog-button:insensitive {
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
+ color: st-transparentize(#ffffff, 0.5);
+ background-color: st-darken(st-mix(#ffffff, #1a1a1a, 9%), 3%);
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
+ box-shadow: none;
+ border: none; }
+
+.dash-label, .window-caption, .screenshot-ui-tooltip {
+ background-color: rgba(0, 0, 0, 0.9);
+ border: 1px solid rgba(255, 255, 255, 0.1);
+ color: #ffffff;
+ border-radius: 999px;
+ padding: 6px 12px;
+ text-align: center;
+ background-color: black;
+ border-color: rgba(255, 255, 255, 0.4); }
+
+/* General Typography */
+.unlock-dialog-clock .unlock-dialog-clock-date, .app-folder-dialog .folder-name-container .folder-name-label, .app-folder-dialog .folder-name-container .folder-name-entry, .search-statustext {
+ font-weight: 800;
+ font-size: 1.818em; }
+
- .unlock-dialog .user-widget.horizontal .user-widget-label, .quick-toggle-menu .header .title {
++.conflicting-session-dialog-content .conflicting-session-dialog-title, .message-dialog-content .message-dialog-title, .datemenu-today-button .date-label {
+ font-weight: 800;
+ font-size: 1.364em; }
+
+.login-dialog .user-widget.horizontal .user-widget-label,
- .login-dialog-not-listed-label, #LookingGlassExtensions .lg-extension .lg-extension-name, #LookingGlassWindows .lg-window .lg-window-name, #LookingGlassPropertyInspector .lg-obj-inspector-title, .background-app-item .title, .osd-window, .dialog-list .dialog-list-title, .message-list-controls, .weather-button .weather-box .weather-header-box .weather-header, .world-clocks-button .world-clocks-header, .events-button .events-box .events-list .event-box .event-summary, .events-button .events-box .events-title, .calendar .calendar-month-header .calendar-month-label {
++.unlock-dialog .user-widget.horizontal .user-widget-label, .quick-toggle-menu .header .title, .message-list .message-list-placeholder {
+ font-weight: 700;
+ font-size: 1.364em; }
+
+.login-dialog-auth-list-label, #LookingGlassDebugFlags .lg-debug-flags-header, #LookingGlassExtensions .lg-extensions-none, .word-suggestions, .bt-menu-placeholder.popup-menu-item, .restart-message, .polkit-dialog-user-layout .polkit-dialog-user-label,
+.polkit-dialog-user-layout .polkit-dialog-user-root-label, .message-dialog-content .message-dialog-title.lightweight {
+ font-weight: 700;
+ font-size: 1.182em; }
+
- .lg-completions-text, .caps-lock-warning-label, .background-app-item .subtitle, .quick-toggle StBoxLayout > .quick-toggle-subtitle, .screenshot-ui-type-button .icon-label-button-container, .prompt-dialog .prompt-dialog-error-label,
++.login-dialog-not-listed-label, #LookingGlassExtensions .lg-extension .lg-extension-name, #LookingGlassWindows .lg-window .lg-window-name, #LookingGlassPropertyInspector .lg-obj-inspector-title, .background-app-item .title, .quick-toggle .quick-toggle-title, .osd-window, .dialog-list .dialog-list-title, .message-list-controls, .weather-button .weather-box .weather-header-box .weather-header, .world-clocks-button .world-clocks-header, .events-button .events-box .events-list .event-box .event-summary, .events-button .events-box .events-title, .calendar .calendar-month-header .calendar-month-label {
+ font-weight: 700;
+ font-size: 1em; }
+
+.quick-toggle-menu .header .subtitle, .app-menu .popup-inactive-menu-item:first-child > StLabel {
+ font-weight: 700;
+ font-size: 0.818em; }
+
- box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.2) !important;
- background-color: st-mix(-st-accent-color, #171717, 5%);
++.lg-completions-text, .caps-lock-warning-label, .background-app-item .subtitle, .quick-toggle .quick-toggle-subtitle, .screenshot-ui-type-button .icon-label-button-container, .prompt-dialog .prompt-dialog-error-label,
+.prompt-dialog .prompt-dialog-info-label,
+.prompt-dialog .prompt-dialog-null-label, .run-dialog .run-dialog-description, .dialog-list .dialog-list-box .dialog-list-item .dialog-list-item-description, .message .message-header .message-header-content .event-time, .world-clocks-button .world-clocks-grid .world-clocks-timezone, .events-button .events-box .events-list .event-box .event-time {
+ font-weight: 400;
+ font-size: 0.818em; }
+
+.weather-button .weather-box .weather-grid .weather-forecast-time, .calendar .calendar-week-number, .calendar .calendar-day-heading, .calendar .calendar-day {
+ font-weight: 400;
+ font-size: 0.818em; }
+
+#LookingGlassDebugFlags .lg-debug-flag-button StLabel, #LookingGlassEvaluator .evaluator-results, .lg-dialog .actor-link {
+ font-family: monospace; }
+
+.unlock-dialog-clock .unlock-dialog-clock-time, #panel, .weather-button .weather-box .weather-grid .weather-forecast-temp, .world-clocks-button .world-clocks-grid .world-clocks-timezone, .world-clocks-button .world-clocks-grid .world-clocks-time, .events-button .events-box .events-list .event-box .event-time, .calendar .calendar-day-heading, .calendar .calendar-day {
+ font-feature-settings: "tnum"; }
+
+/* OSD Elements */
+#LookingGlassDialog, .screenshot-ui-panel, .workspace-switcher, .switcher-list, .resize-popup, .osd-window {
+ color: #ffffff;
+ background-color: #000000;
+ border: 1px solid rgba(255, 255, 255, 0.2);
+ border-radius: 999px;
+ padding: 12px;
+ box-shadow: inset 0 0 0 2px rgba(255, 255, 255, 0.4);
+ border: 2px solid rgba(255, 255, 255, 0.4);
+ box-shadow: none; }
+
+.lg-dialog StEntry {
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
+ background-color: #171717;
+ color: rgba(255, 255, 255, 0.7); }
+ .lg-dialog StEntry:hover {
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
+ background-color: #212121;
+ color: #ffffff; }
+ .lg-dialog StEntry:focus {
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
- box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.2) !important;
- background-color: st-mix(-st-accent-color, st-mix(st-mix(#ffffff, #000000, 9%), #ffffff, 87%), 5%); }
++ box-shadow: inset 0 0 0 2px st-transparentize(st-mix(-st-accent-color, #ffffff, 60%), 0.1) !important;
++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), #171717, 5%);
+ color: #ffffff; }
+ .lg-dialog StEntry:insensitive {
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
+ background-color: #0f0f0f;
+ color: rgba(255, 255, 255, 0.5); }
+ .lg-dialog StEntry StLabel.hint-text {
+ color: rgba(255, 255, 255, 0.7); }
+
+#LookingGlassDebugFlags .lg-debug-flag-button, #LookingGlassPropertyInspector .lg-obj-inspector-close-button,
+#LookingGlassPropertyInspector .lg-obj-inspector-button, #LookingGlassDialog > #Toolbar .lg-toolbar-button {
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
+ color: #ffffff;
+ background-color: st-mix(st-mix(#ffffff, #000000, 9%), #ffffff, 87%); }
+ #LookingGlassDebugFlags .lg-debug-flag-button:focus, #LookingGlassPropertyInspector .lg-obj-inspector-close-button:focus,
+ #LookingGlassPropertyInspector .lg-obj-inspector-button:focus, #LookingGlassDialog > #Toolbar .lg-toolbar-button:focus {
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
+ color: #ffffff;
- background-color: st-mix(-st-accent-color, st-mix(st-lighten(st-mix(#ffffff, #000000, 9%), 4%), #ffffff, 87%), 5%); }
++ box-shadow: inset 0 0 0 2px st-transparentize(st-mix(-st-accent-color, #ffffff, 60%), 0.1) !important;
++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(st-mix(#ffffff, #000000, 9%), #ffffff, 87%), 5%); }
+ #LookingGlassDebugFlags .lg-debug-flag-button:focus:hover, #LookingGlassPropertyInspector .lg-obj-inspector-close-button:focus:hover,
+ #LookingGlassPropertyInspector .lg-obj-inspector-button:focus:hover, #LookingGlassDialog > #Toolbar .lg-toolbar-button:focus:hover {
- background-color: st-mix(-st-accent-color, st-mix(st-lighten(st-mix(#ffffff, #000000, 9%), 9%), #ffffff, 87%), 5%); }
++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(st-lighten(st-mix(#ffffff, #000000, 9%), 4%), #ffffff, 87%), 5%); }
+ #LookingGlassDebugFlags .lg-debug-flag-button:hover, #LookingGlassPropertyInspector .lg-obj-inspector-close-button:hover,
+ #LookingGlassPropertyInspector .lg-obj-inspector-button:hover, #LookingGlassDialog > #Toolbar .lg-toolbar-button:hover {
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
+ color: #ffffff;
+ background-color: st-mix(st-lighten(st-mix(#ffffff, #000000, 9%), 4%), #ffffff, 87%); }
+ #LookingGlassDebugFlags .lg-debug-flag-button:active, #LookingGlassPropertyInspector .lg-obj-inspector-close-button:active,
+ #LookingGlassPropertyInspector .lg-obj-inspector-button:active, #LookingGlassDialog > #Toolbar .lg-toolbar-button:active {
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
+ color: #ffffff;
+ background-color: st-mix(st-lighten(st-mix(#ffffff, #000000, 9%), 9%), #ffffff, 87%); }
+ #LookingGlassDebugFlags .lg-debug-flag-button:active:hover, #LookingGlassPropertyInspector .lg-obj-inspector-close-button:active:hover,
+ #LookingGlassPropertyInspector .lg-obj-inspector-button:active:hover, #LookingGlassDialog > #Toolbar .lg-toolbar-button:active:hover {
+ background-color: st-lighten(st-lighten(st-mix(#ffffff, #000000, 9%), 9%), 4%); }
+ #LookingGlassDebugFlags .lg-debug-flag-button:active:focus, #LookingGlassPropertyInspector .lg-obj-inspector-close-button:active:focus,
+ #LookingGlassPropertyInspector .lg-obj-inspector-button:active:focus, #LookingGlassDialog > #Toolbar .lg-toolbar-button:active:focus {
- box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.2) !important;
- background-color: st-mix(-st-accent-color, rgba(0, 0, 0, 0.25), 5%); }
++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(st-lighten(st-mix(#ffffff, #000000, 9%), 9%), #ffffff, 87%), 5%); }
+ #LookingGlassDebugFlags .lg-debug-flag-button:checked, #LookingGlassPropertyInspector .lg-obj-inspector-close-button:checked,
+ #LookingGlassPropertyInspector .lg-obj-inspector-button:checked, #LookingGlassDialog > #Toolbar .lg-toolbar-button:checked {
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
+ color: #ffffff;
+ background-color: st-mix(st-lighten(st-mix(#ffffff, #000000, 9%), 8%), #ffffff, 87%); }
+ #LookingGlassDebugFlags .lg-debug-flag-button:checked:hover, #LookingGlassPropertyInspector .lg-obj-inspector-close-button:checked:hover,
+ #LookingGlassPropertyInspector .lg-obj-inspector-button:checked:hover, #LookingGlassDialog > #Toolbar .lg-toolbar-button:checked:hover {
+ background-color: st-lighten(st-lighten(st-mix(#ffffff, #000000, 9%), 8%), 4%); }
+ #LookingGlassDebugFlags .lg-debug-flag-button:checked:active, #LookingGlassPropertyInspector .lg-obj-inspector-close-button:checked:active,
+ #LookingGlassPropertyInspector .lg-obj-inspector-button:checked:active, #LookingGlassDialog > #Toolbar .lg-toolbar-button:checked:active {
+ background-color: st-lighten(st-lighten(st-mix(#ffffff, #000000, 9%), 8%), 9%); }
+ #LookingGlassDebugFlags .lg-debug-flag-button:insensitive, #LookingGlassPropertyInspector .lg-obj-inspector-close-button:insensitive,
+ #LookingGlassPropertyInspector .lg-obj-inspector-button:insensitive, #LookingGlassDialog > #Toolbar .lg-toolbar-button:insensitive {
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
+ color: st-transparentize(#ffffff, 0.5);
+ background-color: st-darken(st-mix(#ffffff, #000000, 9%), 3%);
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
+ box-shadow: none;
+ border: none; }
+
+#LookingGlassDialog .notebook-tab, .screenshot-ui-show-pointer-button, .screenshot-ui-type-button {
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
+ color: #ffffff;
+ background-color: #000000;
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
+ box-shadow: none;
+ border: none; }
+ #LookingGlassDialog .notebook-tab:focus, .screenshot-ui-show-pointer-button:focus, .screenshot-ui-type-button:focus {
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
+ color: #ffffff;
- background-color: st-mix(-st-accent-color, st-mix(st-lighten(#000000, 7%), #ffffff, 87%), 5%); }
++ box-shadow: inset 0 0 0 2px st-transparentize(st-mix(-st-accent-color, #ffffff, 60%), 0.1) !important;
++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), rgba(0, 0, 0, 0.25), 5%); }
+ #LookingGlassDialog .notebook-tab:focus:hover, .screenshot-ui-show-pointer-button:focus:hover, .screenshot-ui-type-button:focus:hover {
- background-color: st-mix(-st-accent-color, st-mix(st-lighten(#000000, 9%), #ffffff, 87%), 5%); }
++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(st-lighten(#000000, 7%), #ffffff, 87%), 5%); }
+ #LookingGlassDialog .notebook-tab:hover, .screenshot-ui-show-pointer-button:hover, .screenshot-ui-type-button:hover {
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
+ color: #ffffff;
+ background-color: st-mix(st-lighten(#000000, 7%), #ffffff, 87%); }
+ #LookingGlassDialog .notebook-tab:active, .screenshot-ui-show-pointer-button:active, .screenshot-ui-type-button:active {
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
+ color: #ffffff;
+ background-color: st-mix(st-lighten(#000000, 9%), #ffffff, 87%); }
+ #LookingGlassDialog .notebook-tab:active:hover, .screenshot-ui-show-pointer-button:active:hover, .screenshot-ui-type-button:active:hover {
+ background-color: st-lighten(st-lighten(#000000, 9%), 7%); }
+ #LookingGlassDialog .notebook-tab:active:focus, .screenshot-ui-show-pointer-button:active:focus, .screenshot-ui-type-button:active:focus {
- box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.2) !important;
- background-color: st-mix(-st-accent-color, #232323, 5%);
++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(st-lighten(#000000, 9%), #ffffff, 87%), 5%); }
+ #LookingGlassDialog .notebook-tab:checked, .screenshot-ui-show-pointer-button:checked, .screenshot-ui-type-button:checked {
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
+ color: #ffffff;
+ background-color: st-mix(st-lighten(#000000, 8%), #ffffff, 87%); }
+ #LookingGlassDialog .notebook-tab:checked:hover, .screenshot-ui-show-pointer-button:checked:hover, .screenshot-ui-type-button:checked:hover {
+ background-color: st-lighten(st-lighten(#000000, 8%), 7%); }
+ #LookingGlassDialog .notebook-tab:checked:active, .screenshot-ui-show-pointer-button:checked:active, .screenshot-ui-type-button:checked:active {
+ background-color: st-lighten(st-lighten(#000000, 8%), 9%); }
+ #LookingGlassDialog .notebook-tab:insensitive, .screenshot-ui-show-pointer-button:insensitive, .screenshot-ui-type-button:insensitive {
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
+ color: st-transparentize(#ffffff, 0.5);
+ background-color: #000000;
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
+ box-shadow: none;
+ border: none; }
+
+/* System Elements */
+.login-dialog .login-dialog-prompt-entry, .app-folder-dialog .folder-name-container .folder-name-entry, .search-entry {
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
+ background-color: #232323;
+ color: rgba(255, 255, 255, 0.7); }
+ .login-dialog .login-dialog-prompt-entry:hover, .app-folder-dialog .folder-name-container .folder-name-entry:hover, .search-entry:hover {
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
+ background-color: #2d2d2d;
+ color: #ffffff; }
+ .login-dialog .login-dialog-prompt-entry:focus, .app-folder-dialog .folder-name-container .folder-name-entry:focus, .search-entry:focus {
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
- box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.2) !important;
- background-color: st-mix(-st-accent-color, st-mix(st-mix(#ffffff, #0d0d0d, 9%), #ffffff, 87%), 5%); }
++ box-shadow: inset 0 0 0 2px st-transparentize(st-mix(-st-accent-color, #ffffff, 60%), 0.1) !important;
++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), #232323, 5%);
+ color: #ffffff; }
+ .login-dialog .login-dialog-prompt-entry:insensitive, .app-folder-dialog .folder-name-container .folder-name-entry:insensitive, .search-entry:insensitive {
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
+ background-color: #1b1b1b;
+ color: rgba(255, 255, 255, 0.5); }
+ .login-dialog .login-dialog-prompt-entry StLabel.hint-text, .app-folder-dialog .folder-name-container .folder-name-entry StLabel.hint-text, .search-entry StLabel.hint-text {
+ color: rgba(255, 255, 255, 0.7); }
+
+.login-dialog-button.cancel-button, .login-dialog-button.switch-user-button, .login-dialog-button.login-dialog-session-list-button {
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
+ color: #ffffff;
+ background-color: st-mix(st-mix(#ffffff, #0d0d0d, 9%), #ffffff, 87%); }
+ .login-dialog-button.cancel-button:insensitive, .login-dialog-button.switch-user-button:insensitive, .login-dialog-button.login-dialog-session-list-button:insensitive {
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
+ color: st-transparentize(#ffffff, 0.5);
+ background-color: st-darken(st-mix(#ffffff, #0d0d0d, 9%), 3%);
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
+ box-shadow: none;
+ border: none; }
+ .login-dialog-button.cancel-button:focus, .login-dialog-button.switch-user-button:focus, .login-dialog-button.login-dialog-session-list-button:focus {
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
+ color: #ffffff;
- background-color: st-mix(-st-accent-color, st-mix(st-lighten(st-mix(#ffffff, #0d0d0d, 9%), 4%), #ffffff, 87%), 5%); }
++ box-shadow: inset 0 0 0 2px st-transparentize(st-mix(-st-accent-color, #ffffff, 60%), 0.1) !important;
++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(st-mix(#ffffff, #0d0d0d, 9%), #ffffff, 87%), 5%); }
+ .login-dialog-button.cancel-button:focus:hover, .login-dialog-button.switch-user-button:focus:hover, .login-dialog-button.login-dialog-session-list-button:focus:hover {
- background-color: st-mix(-st-accent-color, st-mix(st-lighten(st-mix(#ffffff, #0d0d0d, 9%), 9%), #ffffff, 87%), 5%); }
++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(st-lighten(st-mix(#ffffff, #0d0d0d, 9%), 4%), #ffffff, 87%), 5%); }
+ .login-dialog-button.cancel-button:hover, .login-dialog-button.switch-user-button:hover, .login-dialog-button.login-dialog-session-list-button:hover {
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
+ color: #ffffff;
+ background-color: st-mix(st-lighten(st-mix(#ffffff, #0d0d0d, 9%), 4%), #ffffff, 87%); }
+ .login-dialog-button.cancel-button:active, .login-dialog-button.switch-user-button:active, .login-dialog-button.login-dialog-session-list-button:active {
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
+ color: #ffffff;
+ background-color: st-mix(st-lighten(st-mix(#ffffff, #0d0d0d, 9%), 9%), #ffffff, 87%); }
+ .login-dialog-button.cancel-button:active:hover, .login-dialog-button.switch-user-button:active:hover, .login-dialog-button.login-dialog-session-list-button:active:hover {
+ background-color: st-lighten(st-lighten(st-mix(#ffffff, #0d0d0d, 9%), 9%), 4%); }
+ .login-dialog-button.cancel-button:active:focus, .login-dialog-button.switch-user-button:active:focus, .login-dialog-button.login-dialog-session-list-button:active:focus {
- box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.2) !important;
- background-color: st-mix(-st-accent-color, st-mix(rgba(255, 255, 255, 0.1), #ffffff, 87%), 5%); }
++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(st-lighten(st-mix(#ffffff, #0d0d0d, 9%), 9%), #ffffff, 87%), 5%); }
+ .login-dialog-button.cancel-button:checked, .login-dialog-button.switch-user-button:checked, .login-dialog-button.login-dialog-session-list-button:checked {
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
+ color: #ffffff;
+ background-color: st-mix(st-lighten(st-mix(#ffffff, #0d0d0d, 9%), 8%), #ffffff, 87%); }
+ .login-dialog-button.cancel-button:checked:hover, .login-dialog-button.switch-user-button:checked:hover, .login-dialog-button.login-dialog-session-list-button:checked:hover {
+ background-color: st-lighten(st-lighten(st-mix(#ffffff, #0d0d0d, 9%), 8%), 4%); }
+ .login-dialog-button.cancel-button:checked:active, .login-dialog-button.switch-user-button:checked:active, .login-dialog-button.login-dialog-session-list-button:checked:active {
+ background-color: st-lighten(st-lighten(st-mix(#ffffff, #0d0d0d, 9%), 8%), 9%); }
+
+/* Lockscreen Elements */
+.unlock-dialog .button,
+.unlock-dialog .icon-button,
+.unlock-dialog .calendar .calendar-month-header .pager-button,
+.calendar .calendar-month-header .unlock-dialog .pager-button,
+.unlock-dialog .message .message-header .message-expand-button,
+.message .message-header .unlock-dialog .message-expand-button,
+.unlock-dialog .message .message-header .message-close-button,
+.message .message-header .unlock-dialog .message-close-button,
+.unlock-dialog .screenshot-ui-show-pointer-button,
+.unlock-dialog .login-dialog-button.cancel-button,
+.unlock-dialog .login-dialog-button.switch-user-button,
+.unlock-dialog .login-dialog-button.login-dialog-session-list-button {
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
+ color: #ffffff;
+ background-color: st-mix(rgba(255, 255, 255, 0.1), #ffffff, 87%); }
+ .unlock-dialog .button:focus,
+ .unlock-dialog .icon-button:focus,
+ .unlock-dialog .calendar .calendar-month-header .pager-button:focus,
+ .calendar .calendar-month-header .unlock-dialog .pager-button:focus,
+ .unlock-dialog .message .message-header .message-expand-button:focus,
+ .message .message-header .unlock-dialog .message-expand-button:focus,
+ .unlock-dialog .message .message-header .message-close-button:focus,
+ .message .message-header .unlock-dialog .message-close-button:focus,
+ .unlock-dialog .screenshot-ui-show-pointer-button:focus,
+ .unlock-dialog .login-dialog-button.cancel-button:focus,
+ .unlock-dialog .login-dialog-button.switch-user-button:focus,
+ .unlock-dialog .login-dialog-button.login-dialog-session-list-button:focus {
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
+ color: #ffffff;
- background-color: st-mix(-st-accent-color, st-mix(rgba(255, 255, 255, 0.13), #ffffff, 87%), 5%); }
++ box-shadow: inset 0 0 0 2px st-transparentize(st-mix(-st-accent-color, #ffffff, 60%), 0.1) !important;
++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(rgba(255, 255, 255, 0.1), #ffffff, 87%), 5%); }
+ .unlock-dialog .button:focus:hover,
+ .unlock-dialog .icon-button:focus:hover,
+ .unlock-dialog .calendar .calendar-month-header .pager-button:focus:hover,
+ .calendar .calendar-month-header .unlock-dialog .pager-button:focus:hover,
+ .unlock-dialog .message .message-header .message-expand-button:focus:hover,
+ .message .message-header .unlock-dialog .message-expand-button:focus:hover,
+ .unlock-dialog .message .message-header .message-close-button:focus:hover,
+ .message .message-header .unlock-dialog .message-close-button:focus:hover,
+ .unlock-dialog .screenshot-ui-show-pointer-button:focus:hover,
+ .unlock-dialog .login-dialog-button.cancel-button:focus:hover,
+ .unlock-dialog .login-dialog-button.switch-user-button:focus:hover,
+ .unlock-dialog .login-dialog-button.login-dialog-session-list-button:focus:hover {
- background-color: st-mix(-st-accent-color, st-mix(rgba(255, 255, 255, 0.16), #ffffff, 87%), 5%); }
++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(rgba(255, 255, 255, 0.13), #ffffff, 87%), 5%); }
+ .unlock-dialog .button:hover,
+ .unlock-dialog .icon-button:hover,
+ .unlock-dialog .calendar .calendar-month-header .pager-button:hover,
+ .calendar .calendar-month-header .unlock-dialog .pager-button:hover,
+ .unlock-dialog .message .message-header .message-expand-button:hover,
+ .message .message-header .unlock-dialog .message-expand-button:hover,
+ .unlock-dialog .message .message-header .message-close-button:hover,
+ .message .message-header .unlock-dialog .message-close-button:hover,
+ .unlock-dialog .screenshot-ui-show-pointer-button:hover,
+ .unlock-dialog .login-dialog-button.cancel-button:hover,
+ .unlock-dialog .login-dialog-button.switch-user-button:hover,
+ .unlock-dialog .login-dialog-button.login-dialog-session-list-button:hover {
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
+ color: #ffffff;
+ background-color: st-mix(rgba(255, 255, 255, 0.13), #ffffff, 87%); }
+ .unlock-dialog .button:active,
+ .unlock-dialog .icon-button:active,
+ .unlock-dialog .calendar .calendar-month-header .pager-button:active,
+ .calendar .calendar-month-header .unlock-dialog .pager-button:active,
+ .unlock-dialog .message .message-header .message-expand-button:active,
+ .message .message-header .unlock-dialog .message-expand-button:active,
+ .unlock-dialog .message .message-header .message-close-button:active,
+ .message .message-header .unlock-dialog .message-close-button:active,
+ .unlock-dialog .screenshot-ui-show-pointer-button:active,
+ .unlock-dialog .login-dialog-button.cancel-button:active,
+ .unlock-dialog .login-dialog-button.switch-user-button:active,
+ .unlock-dialog .login-dialog-button.login-dialog-session-list-button:active {
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
+ color: #ffffff;
+ background-color: st-mix(rgba(255, 255, 255, 0.16), #ffffff, 87%); }
+ .unlock-dialog .button:active:hover,
+ .unlock-dialog .icon-button:active:hover,
+ .unlock-dialog .calendar .calendar-month-header .pager-button:active:hover,
+ .calendar .calendar-month-header .unlock-dialog .pager-button:active:hover,
+ .unlock-dialog .message .message-header .message-expand-button:active:hover,
+ .message .message-header .unlock-dialog .message-expand-button:active:hover,
+ .unlock-dialog .message .message-header .message-close-button:active:hover,
+ .message .message-header .unlock-dialog .message-close-button:active:hover,
+ .unlock-dialog .screenshot-ui-show-pointer-button:active:hover,
+ .unlock-dialog .login-dialog-button.cancel-button:active:hover,
+ .unlock-dialog .login-dialog-button.switch-user-button:active:hover,
+ .unlock-dialog .login-dialog-button.login-dialog-session-list-button:active:hover {
+ background-color: rgba(255, 255, 255, 0.19); }
+ .unlock-dialog .button:active:focus,
+ .unlock-dialog .icon-button:active:focus,
+ .unlock-dialog .calendar .calendar-month-header .pager-button:active:focus,
+ .calendar .calendar-month-header .unlock-dialog .pager-button:active:focus,
+ .unlock-dialog .message .message-header .message-expand-button:active:focus,
+ .message .message-header .unlock-dialog .message-expand-button:active:focus,
+ .unlock-dialog .message .message-header .message-close-button:active:focus,
+ .message .message-header .unlock-dialog .message-close-button:active:focus,
+ .unlock-dialog .screenshot-ui-show-pointer-button:active:focus,
+ .unlock-dialog .login-dialog-button.cancel-button:active:focus,
+ .unlock-dialog .login-dialog-button.switch-user-button:active:focus,
+ .unlock-dialog .login-dialog-button.login-dialog-session-list-button:active:focus {
- box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.2) !important;
- background-color: st-mix(-st-accent-color, rgba(255, 255, 255, 0.1), 5%);
++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(rgba(255, 255, 255, 0.16), #ffffff, 87%), 5%); }
+ .unlock-dialog .button:checked,
+ .unlock-dialog .icon-button:checked,
+ .unlock-dialog .calendar .calendar-month-header .pager-button:checked,
+ .calendar .calendar-month-header .unlock-dialog .pager-button:checked,
+ .unlock-dialog .message .message-header .message-expand-button:checked,
+ .message .message-header .unlock-dialog .message-expand-button:checked,
+ .unlock-dialog .message .message-header .message-close-button:checked,
+ .message .message-header .unlock-dialog .message-close-button:checked,
+ .unlock-dialog .screenshot-ui-show-pointer-button:checked,
+ .unlock-dialog .login-dialog-button.cancel-button:checked,
+ .unlock-dialog .login-dialog-button.switch-user-button:checked,
+ .unlock-dialog .login-dialog-button.login-dialog-session-list-button:checked {
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
+ color: #ffffff;
+ background-color: st-mix(st-lighten(st-mix(#ffffff, #1a1a1a, 9%), 8%), #ffffff, 87%); }
+ .unlock-dialog .button:checked:hover,
+ .unlock-dialog .icon-button:checked:hover,
+ .unlock-dialog .calendar .calendar-month-header .pager-button:checked:hover,
+ .calendar .calendar-month-header .unlock-dialog .pager-button:checked:hover,
+ .unlock-dialog .message .message-header .message-expand-button:checked:hover,
+ .message .message-header .unlock-dialog .message-expand-button:checked:hover,
+ .unlock-dialog .message .message-header .message-close-button:checked:hover,
+ .message .message-header .unlock-dialog .message-close-button:checked:hover,
+ .unlock-dialog .screenshot-ui-show-pointer-button:checked:hover,
+ .unlock-dialog .login-dialog-button.cancel-button:checked:hover,
+ .unlock-dialog .login-dialog-button.switch-user-button:checked:hover,
+ .unlock-dialog .login-dialog-button.login-dialog-session-list-button:checked:hover {
+ background-color: st-lighten(st-lighten(st-mix(#ffffff, #1a1a1a, 9%), 8%), 4%); }
+ .unlock-dialog .button:checked:active,
+ .unlock-dialog .icon-button:checked:active,
+ .unlock-dialog .calendar .calendar-month-header .pager-button:checked:active,
+ .calendar .calendar-month-header .unlock-dialog .pager-button:checked:active,
+ .unlock-dialog .message .message-header .message-expand-button:checked:active,
+ .message .message-header .unlock-dialog .message-expand-button:checked:active,
+ .unlock-dialog .message .message-header .message-close-button:checked:active,
+ .message .message-header .unlock-dialog .message-close-button:checked:active,
+ .unlock-dialog .screenshot-ui-show-pointer-button:checked:active,
+ .unlock-dialog .login-dialog-button.cancel-button:checked:active,
+ .unlock-dialog .login-dialog-button.switch-user-button:checked:active,
+ .unlock-dialog .login-dialog-button.login-dialog-session-list-button:checked:active {
+ background-color: st-lighten(st-lighten(st-mix(#ffffff, #1a1a1a, 9%), 8%), 9%); }
+ .unlock-dialog .button:insensitive,
+ .unlock-dialog .icon-button:insensitive,
+ .unlock-dialog .calendar .calendar-month-header .pager-button:insensitive,
+ .calendar .calendar-month-header .unlock-dialog .pager-button:insensitive,
+ .unlock-dialog .message .message-header .message-expand-button:insensitive,
+ .message .message-header .unlock-dialog .message-expand-button:insensitive,
+ .unlock-dialog .message .message-header .message-close-button:insensitive,
+ .message .message-header .unlock-dialog .message-close-button:insensitive,
+ .unlock-dialog .screenshot-ui-show-pointer-button:insensitive,
+ .unlock-dialog .login-dialog-button.cancel-button:insensitive,
+ .unlock-dialog .login-dialog-button.switch-user-button:insensitive,
+ .unlock-dialog .login-dialog-button.login-dialog-session-list-button:insensitive {
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
+ color: st-transparentize(#ffffff, 0.5);
+ background-color: st-darken(st-mix(#ffffff, #1a1a1a, 9%), 3%);
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
+ box-shadow: none;
+ border: none; }
+
+.unlock-dialog .login-dialog-prompt-entry {
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
+ background-color: rgba(255, 255, 255, 0.1);
+ color: rgba(255, 255, 255, 0.7); }
+ .unlock-dialog .login-dialog-prompt-entry:hover {
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
+ background-color: rgba(255, 255, 255, 0.1);
+ color: #ffffff; }
+ .unlock-dialog .login-dialog-prompt-entry:focus {
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
- box-shadow: inset 0 0 0 2px rgba(255, 255, 255, 0.7) !important;
++ box-shadow: inset 0 0 0 2px st-transparentize(rgba(255, 255, 255, 0.7), 0.1) !important;
++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), rgba(255, 255, 255, 0.1), 5%);
+ color: #ffffff;
- warning-color: #f6d32d;
++ box-shadow: inset 0 0 0 2px st-transparentize(rgba(255, 255, 255, 0.7), 0.1) !important;
+ background-color: st-mix(rgba(255, 255, 255, 0.7), rgba(255, 255, 255, 0.1), 5%); }
+ .unlock-dialog .login-dialog-prompt-entry:insensitive {
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
+ background-color: rgba(247, 247, 247, 0.1);
+ color: rgba(255, 255, 255, 0.5); }
+ .unlock-dialog .login-dialog-prompt-entry StLabel.hint-text {
+ color: rgba(255, 255, 255, 0.7); }
+
+/* WIDGETS */
+.shell-link {
+ color: st-lighten(-st-accent-color, 20%); }
+ .shell-link:hover {
+ color: st-lighten(st-lighten(-st-accent-color, 20%), 10%); }
+
+.lowres-icon {
+ icon-shadow: 0 1px 2px rgba(0, 0, 0, 0.2); }
+
+.icon-dropshadow {
+ icon-shadow: 0 2px 4px rgba(0, 0, 0, 0.4);
+ icon-shadow: none; }
+
+/* Entries */
+StEntry StIcon.capslock-warning {
+ icon-size: 1.091em;
- .popup-menu-item:hover {
- box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
- color: #ffffff;
- background-color: st-mix(st-lighten(st-mix(#ffffff, #262626, 9%), 4%), #ffffff, 87%); }
++ warning-color: #cd9309;
+ padding: 0 4px; }
+
+StEntry StIcon.peek-password {
+ icon-size: 1.091em;
+ padding: 0 4px; }
+
+StEntry StLabel.hint-text {
+ margin-left: 2px; }
+
+/* Buttons */
+.button {
+ min-height: 1.5em; }
+
+.icon-button, .login-dialog-button.cancel-button, .login-dialog-button.switch-user-button, .login-dialog-button.login-dialog-session-list-button, .screenshot-ui-show-pointer-button, .message .message-header .message-expand-button,
+.message .message-header .message-close-button, .calendar .calendar-month-header .pager-button {
+ border-radius: 999px;
+ padding: 0.818em;
+ min-height: 1.091em; }
+ .icon-button StIcon, .login-dialog-button.cancel-button StIcon, .login-dialog-button.switch-user-button StIcon, .login-dialog-button.login-dialog-session-list-button StIcon, .screenshot-ui-show-pointer-button StIcon, .message .message-header .message-expand-button StIcon,
+ .message .message-header .message-close-button StIcon, .calendar .calendar-month-header .pager-button StIcon {
+ icon-size: 1.091em;
+ -st-icon-style: symbolic; }
+
+/* Check Boxes */
+.check-box StBoxLayout {
+ spacing: .8em; }
+
+.check-box StBin {
+ border-radius: 7px;
+ padding: 2px; }
+
+.check-box:focus StBin {
+ background-color: rgba(0, 0, 0, 0.01);
+ box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.65); }
+
+.check-box StIcon {
+ icon-size: 14px;
+ padding: 1px;
+ color: transparent;
+ border-radius: 6px;
+ border: 2px solid rgba(255, 255, 255, 0.15); }
+
+.check-box:hover StIcon {
+ border-color: rgba(255, 255, 255, 0.2); }
+
+.check-box:active StIcon {
+ border-color: rgba(255, 255, 255, 0.3); }
+
+.check-box:checked StIcon {
+ background-color: -st-accent-color;
+ color: -st-accent-fg-color;
+ border-color: transparent; }
+
+.check-box:checked:hover StIcon {
+ background-color: st-lighten(-st-accent-color, 5%);
+ color: st-lighten(-st-accent-fg-color, 5%); }
+
+.check-box:checked:active StIcon {
+ background-color: st-darken(-st-accent-color, 7%);
+ color: st-darken(-st-accent-fg-color, 7%); }
+
+/* Switches */
+.toggle-switch {
+ width: 46px;
+ border-radius: 999px;
+ transition-duration: 100ms;
+ color: #ffffff;
+ background: rgba(255, 255, 255, 0.3); }
+ .toggle-switch:hover {
+ background: rgba(255, 255, 255, 0.4); }
+ .toggle-switch StIcon {
+ icon-size: 16px; }
+ .toggle-switch .handle {
+ margin: 3px;
+ width: 20px;
+ height: 20px;
+ border-radius: 999px;
+ background: #d1d1d1;
+ box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2);
+ transition-duration: 100ms; }
+ .toggle-switch:checked {
+ background: -st-accent-color;
+ color: -st-accent-fg-color; }
+ .toggle-switch:checked:hover {
+ background-color: st-lighten(-st-accent-color, 5%);
+ color: st-lighten(-st-accent-fg-color, 5%); }
+ .toggle-switch:checked .handle {
+ background: white; }
+
+/* Slider */
+.slider {
+ color: #e8e8e8;
+ -barlevel-height: 4px;
+ -barlevel-background-color: rgba(255, 255, 255, 0.1);
+ -barlevel-active-background-color: -st-accent-color;
+ -barlevel-overdrive-color: #c01c28;
+ -barlevel-overdrive-separator-width: 1px;
+ -slider-handle-radius: 0.5455em;
+ -barlevel-background-color: rgba(255, 255, 255, 0.4); }
+ .slider:hover {
+ color: #ffffff; }
+
+/* Scrollbars */
+StScrollView.vfade {
+ -st-vfade-offset: 68px; }
+
+StScrollView.hfade {
+ -st-hfade-offset: 68px; }
+
+StScrollBar {
+ padding: 0; }
+ StScrollView StScrollBar {
+ min-width: 8px;
+ min-height: 8px; }
+ StScrollBar StBin#trough {
+ border-radius: 0;
+ background-color: transparent; }
+ StScrollBar StButton#vhandle, StScrollBar StButton#hhandle {
+ border-radius: 8px;
+ background-color: #5e5e5e;
+ border: 3px solid transparent;
+ transition: 500ms all ease; }
+ StScrollBar StButton#vhandle:hover, StScrollBar StButton#hhandle:hover {
+ background-color: #8c8c8c; }
+ StScrollBar StButton#vhandle:active, StScrollBar StButton#hhandle:active {
+ background-color: #757575; }
+
+/* Popovers/Menus */
+.popup-menu-boxpointer, .candidate-popup-boxpointer {
+ -arrow-rise: 6px; }
+
+.popup-menu {
+ min-width: 15em;
+ color: #ffffff; }
+ .popup-menu.panel-menu {
+ margin-bottom: 1.75em; }
+
+.popup-menu-content, .candidate-popup-content {
+ padding: 6px;
+ background-color: #1a1a1a;
+ border-radius: 20px;
+ border: 1px solid rgba(255, 255, 255, 0.5);
+ box-shadow: 0 2px 4px 0 transparent; }
+
+.popup-menu-item {
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
+ background-color: transparent;
+ border-color: transparent;
+ box-shadow: none;
+ border-radius: 12px; }
+ .popup-menu-item:insensitive {
+ background-color: transparent !important; }
- background-color: st-mix(st-lighten(st-mix(#ffffff, #262626, 9%), 9%), #ffffff, 87%); }
+ .popup-menu-item:active {
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
+ color: #ffffff;
- background-color: st-lighten(st-lighten(st-mix(#ffffff, #262626, 9%), 9%), 4%); }
++ background-color: st-mix(st-lighten(#262626, 9%), #ffffff, 87%); }
+ .popup-menu-item:active:hover {
- background-color: st-mix(-st-accent-color, st-mix(st-lighten(st-mix(#ffffff, #262626, 9%), 9%), #ffffff, 87%), 5%); }
- .popup-menu-item:selected, .popup-menu-item:checked {
++ background-color: st-lighten(st-lighten(#262626, 9%), 7%); }
+ .popup-menu-item:active:focus {
- background-color: st-mix(st-lighten(st-mix(#ffffff, #262626, 9%), 8%), #ffffff, 87%); }
- .popup-menu-item:selected:hover, .popup-menu-item:checked:hover {
- background-color: st-lighten(st-lighten(st-mix(#ffffff, #262626, 9%), 8%), 4%); }
- .popup-menu-item:selected:active, .popup-menu-item:checked:active {
- background-color: st-lighten(st-lighten(st-mix(#ffffff, #262626, 9%), 8%), 9%); }
++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(st-lighten(#262626, 9%), #ffffff, 87%), 5%); }
++ .popup-menu-item:hover, .popup-menu-item:selected, .popup-menu-item:checked {
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
+ color: #ffffff;
- background-color: st-darken(st-mix(#ffffff, #262626, 9%), 3%);
++ background-color: st-mix(st-lighten(#262626, 7%), #ffffff, 87%); }
+ .popup-menu-item:insensitive {
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
+ color: st-transparentize(#ffffff, 0.5);
- .popup-sub-menu .popup-menu-item:hover {
- box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
- color: #ffffff;
- background-color: st-mix(st-lighten(st-mix(#ffffff, #3b3b3b, 9%), 4%), #ffffff, 87%); }
++ background-color: #262626;
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
+ box-shadow: none;
+ border: none; }
+ .popup-menu-item:checked {
+ border-radius: 12px 12px 0 0 !important;
+ border: 1px solid rgba(255, 255, 255, 0.4);
+ border-bottom-width: 0; }
+ .popup-menu-item .toggle-switch:ltr {
+ margin-left: 4px; }
+ .popup-menu-item .toggle-switch:rtl {
+ margin-right: 4px; }
+
+.popup-ornamented-menu-item:ltr {
+ padding-left: 6px; }
+
+.popup-ornamented-menu-item:rtl {
+ padding-right: 6px; }
+
+.popup-inactive-menu-item {
+ color: #ffffff; }
+ .popup-inactive-menu-item:insensitive {
+ color: #ffffff; }
+
+.popup-menu-arrow,
+.popup-menu-icon {
+ icon-size: 1.091em; }
+
+.popup-sub-menu {
+ border-radius: 0 0 13px 13px;
+ margin-bottom: 6px;
+ border: 1px solid transparent;
+ background-color: #3b3b3b;
+ border-color: rgba(255, 255, 255, 0.4); }
+ .popup-sub-menu .popup-menu-item {
+ border-radius: 0;
+ border-top-width: 0;
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
+ background-color: transparent;
+ border-color: transparent;
+ box-shadow: none; }
+ .popup-sub-menu .popup-menu-item:insensitive {
+ background-color: transparent !important; }
- background-color: st-mix(st-lighten(st-mix(#ffffff, #3b3b3b, 9%), 9%), #ffffff, 87%); }
+ .popup-sub-menu .popup-menu-item:active {
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
+ color: #ffffff;
- background-color: st-lighten(st-lighten(st-mix(#ffffff, #3b3b3b, 9%), 9%), 4%); }
++ background-color: st-mix(st-lighten(#3b3b3b, 9%), #ffffff, 87%); }
+ .popup-sub-menu .popup-menu-item:active:hover {
- background-color: st-mix(-st-accent-color, st-mix(st-lighten(st-mix(#ffffff, #3b3b3b, 9%), 9%), #ffffff, 87%), 5%); }
- .popup-sub-menu .popup-menu-item:selected, .popup-sub-menu .popup-menu-item:checked {
++ background-color: st-lighten(st-lighten(#3b3b3b, 9%), 7%); }
+ .popup-sub-menu .popup-menu-item:active:focus {
- background-color: st-mix(st-lighten(st-mix(#ffffff, #3b3b3b, 9%), 8%), #ffffff, 87%); }
- .popup-sub-menu .popup-menu-item:selected:hover, .popup-sub-menu .popup-menu-item:checked:hover {
- background-color: st-lighten(st-lighten(st-mix(#ffffff, #3b3b3b, 9%), 8%), 4%); }
- .popup-sub-menu .popup-menu-item:selected:active, .popup-sub-menu .popup-menu-item:checked:active {
- background-color: st-lighten(st-lighten(st-mix(#ffffff, #3b3b3b, 9%), 8%), 9%); }
++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(st-lighten(#3b3b3b, 9%), #ffffff, 87%), 5%); }
++ .popup-sub-menu .popup-menu-item:hover, .popup-sub-menu .popup-menu-item:selected, .popup-sub-menu .popup-menu-item:checked {
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
+ color: #ffffff;
- background-color: st-darken(st-mix(#ffffff, #3b3b3b, 9%), 3%);
++ background-color: st-mix(st-lighten(#3b3b3b, 7%), #ffffff, 87%); }
+ .popup-sub-menu .popup-menu-item:insensitive {
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
+ color: st-transparentize(#ffffff, 0.5);
- color: rgba(255, 255, 255, 0.25);
- color: rgba(255, 255, 255, 0.5); }
++ background-color: #3b3b3b;
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
+ box-shadow: none;
+ border: none; }
+ .popup-sub-menu .popup-menu-item:last-child {
+ border-radius: 0 0 12px 12px;
+ border-bottom-width: 0; }
+ .popup-sub-menu .popup-menu-section .popup-menu-item:last-child:hover, .popup-sub-menu .popup-menu-section .popup-menu-item:last-child:focus {
+ border-radius: 0; }
+ .popup-sub-menu .popup-menu-section:last-child .popup-menu-item:last-child {
+ border-radius: 0 0 12px 12px; }
+
+.popup-menu-ornament {
+ icon-size: 1.091em !important;
+ width: 1.091em; }
+
+.popup-separator-menu-item {
+ border: none !important; }
+ .popup-separator-menu-item .popup-separator-menu-item-separator {
+ height: 1px;
+ background-color: rgba(255, 255, 255, 0.5); }
+ .popup-sub-menu .popup-separator-menu-item {
+ background-color: transparent; }
+ .popup-sub-menu .popup-separator-menu-item:ltr {
+ margin-right: 2.5em; }
+ .popup-sub-menu .popup-separator-menu-item:rtl {
+ margin-left: 2.5em; }
+ .popup-sub-menu .popup-separator-menu-item .popup-separator-menu-item-separator {
+ background-color: rgba(255, 255, 255, 0.5); }
+
+.background-menu {
+ -boxpointer-gap: 0px;
+ -arrow-rise: 0px; }
+
+.app-menu {
+ max-width: 27.25em; }
+ .app-menu .popup-inactive-menu-item:first-child > StLabel:ltr {
+ margin-right: 8px; }
+ .app-menu .popup-inactive-menu-item:first-child > StLabel:rtl {
+ margin-left: 8px; }
+
+/* Date/Time Menu */
+#calendarArea {
+ padding: 4px; }
+
+.datemenu-popover {
+ border-radius: 30px; }
+
+.datemenu-calendar-column {
+ spacing: 6px; }
+ .datemenu-calendar-column:ltr {
+ margin-left: 6px; }
+ .datemenu-calendar-column:rtl {
+ margin-right: 6px; }
+ .datemenu-calendar-column .datemenu-displays-box {
+ spacing: 6px; }
+
+.datemenu-today-button {
+ padding: 9px; }
+ .datemenu-today-button .day-label {
+ font-weight: bold; }
+
+.calendar {
+ margin-top: 0;
+ padding: 0; }
+ .calendar .calendar-month-header .calendar-change-month-back StIcon,
+ .calendar .calendar-month-header .calendar-change-month-forward StIcon {
+ icon-size: 1.091em; }
+ .calendar .calendar-month-header .calendar-month-label {
+ color: #ffffff !important;
+ padding: 8px 0;
+ width: 10em;
+ border-radius: 999px;
+ text-align: center; }
+ .calendar .calendar-month-header .pager-button {
+ height: 2.6em;
+ width: 2.6em;
+ padding: 0; }
+ .calendar .calendar-day {
+ border-radius: 999px;
+ height: 3em;
+ width: 3em;
+ margin: 2px;
+ padding: 0;
+ font-weight: bold;
+ text-align: center; }
+ .calendar .calendar-day.calendar-weekend {
+ color: #ffffff;
+ font-style: italic; }
+ .calendar .calendar-day.calendar-other-month {
+ color: rgba(255, 255, 255, 0.5);
+ font-weight: normal;
+ color: #ffffff;
+ font-style: italic; }
+ .calendar .calendar-day.calendar-other-month.calendar-weekend {
+ color: rgba(255, 255, 255, 0.5);
+ color: #ffffff; }
+ .calendar .calendar-day.calendar-today {
+ color: -st-accent-fg-color !important; }
+ .calendar .calendar-day.calendar-today.calendar-day-with-events {
+ background-image: url("resource:///org/gnome/shell/theme/calendar-today.svg") !important; }
+ .calendar .calendar-day.calendar-day-with-events {
+ background-image: url("resource:///org/gnome/shell/theme/calendar-today.svg");
+ background-size: contain; }
+ .calendar .calendar-day-heading {
+ font-weight: bold;
+ text-align: center;
+ margin: 4px;
+ padding: 3px 6px;
+ border-radius: 8px; }
+ .calendar .calendar-week-number {
+ font-weight: bold;
+ font-feature-settings: "tnum";
+ text-align: center;
+ margin: 6px;
+ padding: 0 6px;
+ border-radius: 4px;
+ background-color: rgba(255, 255, 255, 0.2);
+ color: #ffffff; }
+
+.events-button .events-box .events-title {
+ color: #ffffff;
+ padding-bottom: 6px; }
+
+.events-button .events-box .events-list {
+ spacing: 6px; }
+ .events-button .events-box .events-list .event-box {
+ spacing: 6px;
+ border-radius: 8px; }
+ .events-button .events-box .events-list .event-box .event-time {
+ color: #ffffff; }
+ .events-button .events-box .events-list .event-placeholder {
+ color: #ffffff;
+ font-style: italic; }
+
+.world-clocks-button .world-clocks-header {
+ color: #ffffff; }
+ .world-clocks-button .world-clocks-header.no-world-clocks {
+ color: #ffffff; }
+
+.world-clocks-button .world-clocks-grid {
+ spacing-rows: 6px;
+ spacing-columns: 12px; }
+ .world-clocks-button .world-clocks-grid .world-clocks-time {
+ font-weight: bold; }
+ .world-clocks-button .world-clocks-grid .world-clocks-time:ltr {
+ text-align: right; }
+ .world-clocks-button .world-clocks-grid .world-clocks-time:rtl {
+ text-align: left; }
+ .world-clocks-button .world-clocks-grid .world-clocks-timezone {
+ color: #ffffff; }
+
+.weather-button .weather-box {
+ spacing: 6px; }
+ .weather-button .weather-box .weather-header-box {
+ spacing: 6px; }
+ .weather-button .weather-box .weather-header-box .weather-header {
+ color: #ffffff; }
+ .weather-button .weather-box .weather-header-box .weather-header.no-location {
+ color: #ffffff; }
+ .weather-button .weather-box .weather-header-box .weather-header.location {
+ font-weight: normal; }
+ .weather-button .weather-box .weather-grid {
+ spacing-rows: 6px;
+ spacing-columns: 12px; }
+ .weather-button .weather-box .weather-grid .weather-forecast-time {
+ padding-top: 6px;
+ padding-bottom: 6px; }
+ .weather-button .weather-box .weather-grid .weather-forecast-icon {
+ icon-size: 2.182em;
+ margin-bottom: 4px; }
+ .weather-button .weather-box .weather-grid .weather-forecast-temp {
+ font-weight: bold; }
+
+/* Message List */
+.message-list {
+ width: 29em;
+ border: solid rgba(255, 255, 255, 0.5); }
+ .message-list:ltr {
+ margin-left: 0;
+ margin-right: 4px;
+ padding-right: 6px;
+ border-right-width: 1px; }
+ .message-list:rtl {
+ margin-right: 0;
+ margin-left: 4px;
+ padding-left: 6px;
+ border-left-width: 1px; }
+ .message-list .message-list-placeholder {
- color: #f6d32d;
- background-color: rgba(246, 211, 45, 0.1);
++ color: rgba(255, 255, 255, 0.45);
++ color: #ffffff; }
+ .message-list .message-list-placeholder > StIcon {
+ icon-size: 96px;
+ margin-bottom: 12px;
+ -st-icon-style: symbolic; }
+
+.message-list-sections {
+ spacing: 12px; }
+ .message-list-sections:ltr {
+ margin-right: 12px; }
+ .message-list-sections:rtl {
+ margin-left: 12px; }
+
+.message-list-section,
+.message-list-section-list {
+ spacing: 12px; }
+
+.message-list-controls {
+ padding: 12px;
+ padding-bottom: 6px;
+ spacing: 6px; }
+ .message-list-controls .dnd-button {
+ border-width: 2px;
+ border-color: transparent;
+ border-radius: 32px;
+ border-style: solid; }
+ .message-list-controls .dnd-button:focus {
+ border-color: st-transparentize(-st-accent-color, 0.4); }
+
+.message {
+ padding: 6px;
+ margin: 0;
+ border-radius: 16px; }
+ .message .message-header {
+ spacing: 6px;
+ color: #ffffff;
+ padding: 0 6px; }
+ .message .message-header:ltr {
+ padding-right: 0; }
+ .message .message-header:rtl {
+ padding-left: 0; }
+ .message .message-header .message-source-icon {
+ icon-size: 1.091em;
+ -st-icon-style: symbolic; }
+ .message .message-header .message-header-content {
+ spacing: 6px;
+ min-height: 1.637em;
+ padding-bottom: 6px; }
+ .message .message-header .message-header-content .message-source-title {
+ font-weight: bold; }
+ .message .message-header .message-header-content .event-time {
+ color: #ffffff;
+ padding-bottom: 0.068em; }
+ .message .message-header .message-header-content .event-time:ltr {
+ text-align: right; }
+ .message .message-header .message-header-content .event-time:rtl {
+ text-align: left; }
+ .message .message-header .message-expand-button,
+ .message .message-header .message-close-button {
+ border-radius: 999px;
+ color: #ffffff; }
+ .message .message-header .message-expand-button {
+ padding: 6px; }
+ .message .message-header .message-close-button {
+ margin: 3px;
+ padding: 4px; }
+ .message .message-box {
+ padding: 6px;
+ margin-top: 0;
+ spacing: 6px; }
+ .message .message-box .message-icon {
+ icon-size: 48px; }
+ .message .message-box .message-icon:ltr {
+ margin-right: 6px; }
+ .message .message-box .message-icon:rtl {
+ margin-left: 6px; }
+ .message .message-box .message-icon.message-themed-icon {
+ border-radius: 999px;
+ background-color: rgba(255, 255, 255, 0.07);
+ icon-size: 1.091em;
+ min-width: 48px;
+ min-height: 48px; }
+ .message .message-box:first-child {
+ margin-top: 12px; }
+ .message .message-box .message-content {
+ spacing: 4px; }
+ .message .message-box .message-content .message-title {
+ font-weight: bold; }
+ .message .message-action-bin {
+ padding: 4px;
+ spacing: 6px; }
+ .message .message-action-bin * {
+ margin: 0 4px; }
+ .message .message-action-bin *:first-child:ltr {
+ margin-left: 0; }
+ .message .message-action-bin *:first-child:rtl {
+ margin-right: 0; }
+ .message .message-action-bin *:last-child:ltr {
+ margin-right: 0; }
+ .message .message-action-bin *:last-child:rtl {
+ margin-left: 0; }
+
+.url-highlighter {
+ link-color: st-lighten(-st-accent-color, 20%); }
+
+/* Media Controls */
+.message-media-control {
+ padding: 0 18px;
+ border-radius: 8px;
+ color: #ffffff;
+ border: 1px solid transparent;
+ border-color: rgba(255, 255, 255, 0.4);
+ margin: 12px 2px; }
+ .message-media-control:hover {
+ background-color: #595959;
+ color: #ffffff; }
+ .message-media-control:active {
+ background-color: #5e5e5e;
+ color: #ffffff; }
+ .message-media-control:insensitive {
+ color: white;
+ border-color: transparent; }
+ .message-media-control StIcon {
+ icon-size: 16px; }
+
+.media-message .message-icon {
+ border-radius: 8px !important; }
+ .media-message .message-icon.message-themed-icon {
+ icon-size: 32px !important; }
+
+.candidate-popup-content {
+ padding: 6px;
+ spacing: 6px;
+ border-radius: 12px; }
+
+.candidate-index {
+ padding: 0;
+ padding-right: 6px;
+ color: #ffffff; }
+
+.candidate-box {
+ padding: 6px 12px 6px 12px;
+ border-radius: 8px; }
+ .candidate-box:selected {
+ background-color: -st-accent-color;
+ color: -st-accent-fg-color; }
+ .candidate-box:hover {
+ background-color: #4d4d4d;
+ color: white; }
+
+.candidate-page-button-box {
+ height: 2em; }
+ .vertical .candidate-page-button-box {
+ padding-top: 12px; }
+ .horizontal .candidate-page-button-box {
+ padding-left: 12px; }
+
+.candidate-page-button {
+ padding: 6px; }
+ .candidate-page-button StIcon {
+ icon-size: 16px; }
+
+.candidate-page-button-previous {
+ border-radius: 8px 0px 0px 8px;
+ border-right-width: 0;
+ box-shadow: none; }
+
+.candidate-page-button-next {
+ border-radius: 0px 8px 8px 0px;
+ box-shadow: none; }
+
+/* Notifications & Message Tray */
+.notification-banner {
+ min-height: 64px;
+ width: 34em;
+ box-shadow: 0 2px 4px 2px transparent;
+ border-radius: 16px;
+ margin: 4px;
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); }
+
+.notification-buttons-bin {
+ spacing: 0; }
+
+/* Modal Dialogs */
+.modal-dialog {
+ background-color: #1a1a1a;
+ border-radius: 18px;
+ padding: 24px;
+ spacing: 18px;
+ box-shadow: 0 12px 8px 12px rgba(0, 0, 0, 0.03); }
+ .modal-dialog .modal-dialog-content-box {
+ padding-top: 12px;
+ spacing: 18px;
+ max-width: 28em; }
+ .modal-dialog .modal-dialog-button-box {
+ padding-top: 6px; }
+
+.dialog-list {
+ spacing: 18px; }
+ .dialog-list .dialog-list-title {
+ text-align: center; }
+ .dialog-list .dialog-list-scrollview {
+ max-height: 200px; }
+ .dialog-list .dialog-list-box {
+ spacing: 1em; }
+ .dialog-list .dialog-list-box .dialog-list-item {
+ spacing: 1em; }
+ .dialog-list .dialog-list-box .dialog-list-item .dialog-list-item-title {
+ font-weight: bold; }
+ .dialog-list .dialog-list-box .dialog-list-item .dialog-list-item-description {
+ color: #f2f2f2; }
+
+/* End Session Dialog */
+.end-session-dialog {
+ width: 24em; }
+ .end-session-dialog .end-session-dialog-battery-warning,
+ .end-session-dialog .dialog-list-title {
- color: #f6d32d; }
++ color: #cd9309;
++ background-color: rgba(205, 147, 9, 0.1);
+ padding: 9px;
+ border-radius: 8px;
+ margin: 4px 0; }
+
+/* Message Dialog */
+.message-dialog-content {
+ spacing: 18px; }
+ .message-dialog-content .message-dialog-title {
+ text-align: center; }
+ .message-dialog-content .message-dialog-description {
+ text-align: center; }
+
+/* Run Dialog */
+.run-dialog {
+ width: 24em;
+ padding-bottom: 6px; }
+ .run-dialog .run-dialog-entry {
+ padding: 12px 9px; }
+ .run-dialog .run-dialog-description {
+ color: #cccccc; }
+
+/* Password or Authentication Dialog */
+.prompt-dialog {
+ width: 28em; }
+ .prompt-dialog .prompt-dialog-password-grid {
+ spacing-rows: 8px;
+ spacing-columns: 4px; }
+ .prompt-dialog .prompt-dialog-password-grid .prompt-dialog-password-entry {
+ width: auto; }
+ .prompt-dialog .prompt-dialog-password-grid .prompt-dialog-password-entry:ltr {
+ margin-left: 20px; }
+ .prompt-dialog .prompt-dialog-password-grid .prompt-dialog-password-entry:rtl {
+ margin-right: 20px; }
+ .prompt-dialog .prompt-dialog-password-layout {
+ spacing: 8px; }
+ .prompt-dialog .prompt-dialog-password-entry {
+ width: 20em;
+ padding: 12px 9px; }
+ .prompt-dialog .prompt-dialog-error-label,
+ .prompt-dialog .prompt-dialog-info-label,
+ .prompt-dialog .prompt-dialog-null-label {
+ text-align: center; }
+ .prompt-dialog .prompt-dialog-error-label {
- color: #f6d32d; }
++ color: #cd9309; }
+
+/* Polkit Dialog */
+.polkit-dialog-user-layout {
+ text-align: center;
+ spacing: 8px;
+ margin-bottom: 6px; }
+ .polkit-dialog-user-layout .polkit-dialog-user-root-label {
- border: none; }
++ color: #cd9309; }
+
+/* Audio selection dialog */
+.audio-device-selection-dialog {
+ min-width: 24em; }
+ .audio-device-selection-dialog .audio-selection-box {
+ spacing: 12px; }
+ .audio-device-selection-dialog .audio-selection-box .audio-selection-device {
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
+ color: #ffffff;
+ background-color: #000000;
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
+ box-shadow: none;
- box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.2) !important;
- background-color: st-mix(-st-accent-color, rgba(0, 0, 0, 0.25), 5%); }
++ border: none;
++ background-color: transparent; }
+ .audio-device-selection-dialog .audio-selection-box .audio-selection-device:focus {
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
+ color: #ffffff;
- background-color: st-mix(-st-accent-color, st-mix(st-lighten(#000000, 7%), #ffffff, 87%), 5%); }
++ box-shadow: inset 0 0 0 2px st-transparentize(st-mix(-st-accent-color, #ffffff, 60%), 0.1) !important;
++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), rgba(0, 0, 0, 0.25), 5%); }
+ .audio-device-selection-dialog .audio-selection-box .audio-selection-device:focus:hover {
- background-color: st-mix(-st-accent-color, st-mix(st-lighten(#000000, 9%), #ffffff, 87%), 5%); }
++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(st-lighten(#000000, 7%), #ffffff, 87%), 5%); }
+ .audio-device-selection-dialog .audio-selection-box .audio-selection-device:hover {
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
+ color: #ffffff;
+ background-color: st-mix(st-lighten(#000000, 7%), #ffffff, 87%); }
+ .audio-device-selection-dialog .audio-selection-box .audio-selection-device:active {
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
+ color: #ffffff;
+ background-color: st-mix(st-lighten(#000000, 9%), #ffffff, 87%); }
+ .audio-device-selection-dialog .audio-selection-box .audio-selection-device:active:hover {
+ background-color: st-lighten(st-lighten(#000000, 9%), 7%); }
+ .audio-device-selection-dialog .audio-selection-box .audio-selection-device:active:focus {
- .osd-monitor-label {
++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(st-lighten(#000000, 9%), #ffffff, 87%), 5%); }
+ .audio-device-selection-dialog .audio-selection-box .audio-selection-device:highlighted, .audio-device-selection-dialog .audio-selection-box .audio-selection-device:selected, .audio-device-selection-dialog .audio-selection-box .audio-selection-device:checked {
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
+ color: #ffffff;
+ background-color: st-mix(st-lighten(#000000, 8%), #ffffff, 87%); }
+ .audio-device-selection-dialog .audio-selection-box .audio-selection-device:highlighted:hover, .audio-device-selection-dialog .audio-selection-box .audio-selection-device:selected:hover, .audio-device-selection-dialog .audio-selection-box .audio-selection-device:checked:hover {
+ background-color: st-lighten(st-lighten(#000000, 8%), 7%); }
+ .audio-device-selection-dialog .audio-selection-box .audio-selection-device:highlighted:active, .audio-device-selection-dialog .audio-selection-box .audio-selection-device:selected:active, .audio-device-selection-dialog .audio-selection-box .audio-selection-device:checked:active {
+ background-color: st-lighten(st-lighten(#000000, 8%), 9%); }
+ .audio-device-selection-dialog .audio-selection-box .audio-selection-device:insensitive {
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
+ color: st-transparentize(#ffffff, 0.5);
+ background-color: #000000;
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
+ box-shadow: none;
+ border: none; }
+ .audio-device-selection-dialog .audio-selection-box .audio-selection-device:drop {
+ background-color: st-transparentize(-st-accent-color, 0.8);
+ box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.2); }
+ .audio-device-selection-dialog .audio-selection-box .audio-selection-device .audio-selection-device-box {
+ padding: 12px;
+ spacing: 12px; }
+ .audio-device-selection-dialog .audio-selection-box .audio-selection-device .audio-selection-device-icon {
+ icon-size: 64px; }
+
+/* Welcome dialog */
+.welcome-dialog-image {
+ background-image: url("resource:///org/gnome/shell/theme/gnome-shell-start.svg");
+ background-size: contain;
+ /* Reasonable maximum dimensions */
+ height: 300px;
+ width: 300px; }
+
+/* Access portal dialog */
+.access-dialog {
+ text-align: center; }
+
+/* OSD */
+.osd-window {
+ text-align: center;
+ font-weight: bold;
+ spacing: 12px;
+ padding: 12px 18px;
+ margin-bottom: 4em; }
+ .osd-window > * {
+ spacing: 8px; }
+ .osd-window StIcon {
+ icon-size: 32px; }
+ .osd-window StLabel:ltr {
+ margin-right: 6px; }
+ .osd-window StLabel:rtl {
+ margin-left: 6px; }
+ .osd-window .level {
+ margin-bottom: 4px;
+ min-width: 160px;
+ -barlevel-height: 6px;
+ -barlevel-background-color: rgba(255, 255, 255, 0.1);
+ -barlevel-active-background-color: #ffffff;
+ -barlevel-overdrive-color: #c01c28;
+ -barlevel-overdrive-separator-width: 3px; }
+ .osd-window .level:first-child {
+ margin-bottom: 0; }
+ .osd-window .level:ltr {
+ margin-right: 6px; }
+ .osd-window .level:rtl {
+ margin-left: 6px; }
+
- border: none; }
++.osd-monitor-label, .osd-break-countdown-label {
+ background-color: -st-accent-color;
+ color: -st-accent-fg-color;
+ border-radius: 16px;
+ font-size: 3em;
+ font-weight: bold;
+ font-feature-settings: "tnum";
+ margin: 12px;
+ padding: 12px;
+ text-align: center;
+ min-width: 1.5em; }
+
+/* Pad OSD */
+.pad-osd-window {
+ padding: 32px;
+ background-color: rgba(0, 0, 0, 0.8); }
+ .pad-osd-window .pad-osd-title-box {
+ spacing: 12px; }
+ .pad-osd-window .pad-osd-title-menu-box {
+ spacing: 6px; }
+
+.combo-box-label {
+ width: 15em; }
+
+/* App Switcher */
+.switcher-popup {
+ padding: 0;
+ spacing: 24px; }
+
+.switcher-list {
+ padding: 12px;
+ border-radius: 28px;
+ box-shadow: 0 8px 8px 0 transparent; }
+ .switcher-list .switcher-list-item-container {
+ spacing: 12px; }
+ .switcher-list .item-box {
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
+ color: #ffffff;
+ background-color: #000000;
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
+ box-shadow: none;
- box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.2) !important;
- background-color: st-mix(-st-accent-color, rgba(0, 0, 0, 0.25), 5%); }
++ border: none;
++ background-color: transparent; }
+ .switcher-list .item-box:focus {
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
+ color: #ffffff;
- background-color: st-mix(-st-accent-color, st-mix(st-lighten(#000000, 7%), #ffffff, 87%), 5%); }
++ box-shadow: inset 0 0 0 2px st-transparentize(st-mix(-st-accent-color, #ffffff, 60%), 0.1) !important;
++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), rgba(0, 0, 0, 0.25), 5%); }
+ .switcher-list .item-box:focus:hover {
- background-color: st-mix(-st-accent-color, st-mix(st-lighten(#000000, 9%), #ffffff, 87%), 5%); }
++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(st-lighten(#000000, 7%), #ffffff, 87%), 5%); }
+ .switcher-list .item-box:hover {
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
+ color: #ffffff;
+ background-color: st-mix(st-lighten(#000000, 7%), #ffffff, 87%); }
+ .switcher-list .item-box:active {
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
+ color: #ffffff;
+ background-color: st-mix(st-lighten(#000000, 9%), #ffffff, 87%); }
+ .switcher-list .item-box:active:hover {
+ background-color: st-lighten(st-lighten(#000000, 9%), 7%); }
+ .switcher-list .item-box:active:focus {
- color: whitesmoke;
++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(st-lighten(#000000, 9%), #ffffff, 87%), 5%); }
+ .switcher-list .item-box:highlighted, .switcher-list .item-box:selected, .switcher-list .item-box:checked {
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
+ color: #ffffff;
+ background-color: st-mix(st-lighten(#000000, 8%), #ffffff, 87%); }
+ .switcher-list .item-box:highlighted:hover, .switcher-list .item-box:selected:hover, .switcher-list .item-box:checked:hover {
+ background-color: st-lighten(st-lighten(#000000, 8%), 7%); }
+ .switcher-list .item-box:highlighted:active, .switcher-list .item-box:selected:active, .switcher-list .item-box:checked:active {
+ background-color: st-lighten(st-lighten(#000000, 8%), 9%); }
+ .switcher-list .item-box:insensitive {
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
+ color: st-transparentize(#ffffff, 0.5);
+ background-color: #000000;
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
+ box-shadow: none;
+ border: none; }
+ .switcher-list .item-box:drop {
+ background-color: st-transparentize(-st-accent-color, 0.8);
+ box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.2); }
+ .switcher-list .item-box:hover {
+ background: none; }
+ .switcher-list .item-box:selected {
+ background-color: rgba(255, 255, 255, 0.2); }
+ .switcher-list .item-box:selected {
+ background-color: rgba(255, 255, 255, 0.3); }
+ .switcher-list .separator {
+ width: 1px;
+ background: rgba(255, 255, 255, 0.5); }
+ .switcher-list .thumbnail-box {
+ padding: 2px;
+ spacing: 6px; }
+ .switcher-list .thumbnail {
+ width: 256px;
+ border-radius: 8px; }
+
+.switcher-arrow {
+ border-color: rgba(255, 255, 255, 0.8);
+ color: rgba(255, 255, 255, 0.8); }
+ .switcher-arrow:highlighted {
+ border-color: #ffffff;
+ color: #ffffff; }
+
+.input-source-switcher-symbol {
+ font-size: 34pt;
+ width: 96px;
+ height: 96px; }
+
+.cycler-highlight {
+ border: 5px solid -st-accent-color; }
+
+/* Workspace Switcher */
+.workspace-switcher {
+ margin-bottom: 4em;
+ spacing: 12px;
+ padding: 12px 18px; }
+
+.ws-switcher-indicator {
+ background-color: rgba(255, 255, 255, 0.5);
+ padding: 2.6666666667px;
+ margin: 13.3333333333px;
+ border-radius: 32px; }
+ .ws-switcher-indicator:active {
+ background-color: #ffffff;
+ padding: 5.3333333333px;
+ margin: 10.6666666667px; }
+
+.screenshot-ui-panel {
+ border-radius: 32px;
+ padding: 18px;
+ padding-bottom: 12px;
+ margin-bottom: 4em;
+ spacing: 12px; }
+
+.screenshot-ui-close-button {
+ padding: 6px !important;
+ margin-top: 12px;
+ box-shadow: 0 2px 4px 0 transparent; }
+ .screenshot-ui-close-button.left {
+ margin-left: 12px; }
+ .screenshot-ui-close-button.right {
+ margin-right: 12px; }
+
+.screenshot-ui-type-button {
+ min-width: 48px;
+ padding: 12px 18px;
+ border-radius: 14px; }
+ .screenshot-ui-type-button .icon-label-button-container {
+ spacing: 0.409em; }
+ .screenshot-ui-type-button .icon-label-button-container > StIcon {
+ icon-size: 32px; }
+
+.screenshot-ui-capture-button {
+ width: 32px;
+ height: 32px;
+ border-radius: 999px;
+ border: 4px #ffffff;
+ padding: 4px; }
+ .screenshot-ui-capture-button .screenshot-ui-capture-button-circle {
+ background-color: #ffffff;
+ transition-duration: 200ms;
+ border-radius: 999px; }
+ .screenshot-ui-capture-button .screenshot-ui-capture-button-circle:hover, .screenshot-ui-capture-button .screenshot-ui-capture-button-circle:focus {
+ background-color: #4d4d4d; }
+ .screenshot-ui-capture-button:hover .screenshot-ui-capture-button-circle, .screenshot-ui-capture-button:focus .screenshot-ui-capture-button-circle {
+ background-color: #cccccc; }
+ .screenshot-ui-capture-button:active .screenshot-ui-capture-button-circle {
+ background-color: gray; }
+ .screenshot-ui-capture-button:cast .screenshot-ui-capture-button-circle {
+ background-color: #c01c28; }
+ .screenshot-ui-capture-button:cast:hover .screenshot-ui-capture-button-circle, .screenshot-ui-capture-button:cast:focus .screenshot-ui-capture-button-circle {
+ background-color: #d61f2d; }
+ .screenshot-ui-capture-button:cast:active .screenshot-ui-capture-button-circle {
+ background-color: #a11722; }
+
+.screenshot-ui-shot-cast-container {
+ background-color: rgba(255, 255, 255, 0.1);
+ border-radius: 999px;
+ padding: 3px;
+ spacing: 3px;
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); }
+
+.screenshot-ui-shot-cast-button {
+ padding: 6px 12px;
+ background-color: transparent;
+ border-radius: 999px;
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); }
+ .screenshot-ui-shot-cast-button > StIcon {
+ icon-size: 16px; }
+ .screenshot-ui-shot-cast-button:hover, .screenshot-ui-shot-cast-button:focus {
+ background-color: rgba(255, 255, 255, 0.2); }
+ .screenshot-ui-shot-cast-button:active {
+ background-color: rgba(255, 255, 255, 0.5); }
+ .screenshot-ui-shot-cast-button:checked {
+ background-color: #ffffff;
+ color: #000000; }
+ .screenshot-ui-shot-cast-button:insensitive {
+ color: rgba(255, 255, 255, 0.5); }
+
+.screenshot-ui-area-indicator-shade {
+ background-color: rgba(0, 0, 0, 0.3); }
+
+.screenshot-ui-area-selector .screenshot-ui-area-indicator-shade {
+ background-color: rgba(0, 0, 0, 0.5); }
+
+.screenshot-ui-area-selector .screenshot-ui-area-indicator-selection {
+ border: 2px white; }
+
+.screenshot-ui-area-selector-handle {
+ border-radius: 999px;
+ background-color: white;
+ box-shadow: 0 1px 3px 2px transparent;
+ width: 24px;
+ height: 24px; }
+
+.screenshot-ui-window-selector {
+ background-color: #000000; }
+ .screenshot-ui-window-selector .screenshot-ui-window-selector-window-container {
+ margin: 100px; }
+ .screenshot-ui-window-selector:primary-monitor .screenshot-ui-window-selector-window-container {
+ margin-bottom: 200px; }
+
+.screenshot-ui-window-selector-window-border {
+ transition-duration: 200ms;
+ border-radius: 16px;
+ border: 6px transparent; }
+
+.screenshot-ui-window-selector-check {
+ transition-duration: 200ms;
+ color: transparent;
+ border-radius: 999px;
+ border-width: 12px;
+ icon-size: 24px; }
+
+.screenshot-ui-window-selector-window:hover .screenshot-ui-window-selector-window-border {
+ border-color: st-darken(-st-accent-color, 15%); }
+
+.screenshot-ui-window-selector-window:checked .screenshot-ui-window-selector-window-border {
+ border-color: -st-accent-color;
+ background-color: st-transparentize(-st-accent-color, 0.8); }
+
+.screenshot-ui-window-selector-window:checked .screenshot-ui-window-selector-check {
+ color: -st-accent-fg-color;
+ background-color: -st-accent-color; }
+
+.screenshot-ui-screen-selector {
+ transition-duration: 200ms;
+ background-color: rgba(0, 0, 0, 0.5); }
+ .screenshot-ui-screen-selector:hover {
+ background-color: rgba(0, 0, 0, 0.3); }
+ .screenshot-ui-screen-selector:active {
+ background-color: rgba(0, 0, 0, 0.7); }
+ .screenshot-ui-screen-selector:checked {
+ background-color: transparent;
+ border: 2px white; }
+
+.screenshot-ui-tooltip {
+ text-align: center;
+ -y-offset: 24px; }
+
+/* Top Bar */
+#panel {
+ background-color: #000000;
+ font-weight: bold;
+ height: 2.2em;
+ transition-duration: 250ms; }
+ #panel .panel-button {
+ transition-duration: 150ms;
+ border: 3px solid transparent;
+ background-color: transparent;
+ border-radius: 999px;
+ font-weight: bold;
+ color: #ffffff;
+ box-shadow: inset 0 0 0 100px transparent;
+ -natural-hpadding: 12px;
+ -minimum-hpadding: 6px; }
+ #panel .panel-button:focus, #panel .panel-button:hover {
+ box-shadow: inset 0 0 0 100px rgba(255, 255, 255, 0.17); }
+ #panel .panel-button:active, #panel .panel-button:checked {
+ box-shadow: inset 0 0 0 100px rgba(255, 255, 255, 0.28); }
+ #panel .panel-button:active:hover, #panel .panel-button:checked:hover {
+ box-shadow: inset 0 0 0 100px rgba(255, 255, 255, 0.32); }
+ #panel .panel-button .system-status-icon {
+ icon-size: 1.091em;
+ padding: 0 6px;
+ margin: 0 4px; }
+ #panel .panel-button .app-menu-icon {
+ -st-icon-style: symbolic; }
+ #panel .panel-button .panel-status-menu-box,
+ #panel .panel-button .panel-status-indicators-box {
+ spacing: 4px; }
+ #panel .panel-button .panel-status-menu-box > .system-status-icon,
+ #panel .panel-button .panel-status-indicators-box > .system-status-icon {
+ padding: 0; }
+ #panel .panel-button#panelActivities StBoxLayout {
+ padding: 0 0.2045em;
+ spacing: 5px; }
+ #panel .panel-button#panelActivities .workspace-dot {
+ border-radius: 999px;
+ min-width: 0.5455em;
+ min-height: 0.5455em;
+ background-color: #ffffff; }
+ #panel .panel-button.screen-recording-indicator StBoxLayout, #panel .panel-button.screen-sharing-indicator StBoxLayout {
+ spacing: 0.409em; }
+ #panel .panel-button.screen-recording-indicator StIcon, #panel .panel-button.screen-sharing-indicator StIcon {
+ icon-size: 1.091em; }
+ #panel .panel-button.screen-recording-indicator {
+ transition-duration: 150ms;
+ border: 3px solid transparent;
+ background-color: transparent;
+ border-radius: 999px;
+ font-weight: bold;
- color: whitesmoke;
++ color: #fafafb;
+ box-shadow: inset 0 0 0 100px #c01c28; }
+ #panel .panel-button.screen-recording-indicator:focus, #panel .panel-button.screen-recording-indicator:hover {
+ box-shadow: inset 0 0 0 100px #d61f2d; }
+ #panel .panel-button.screen-recording-indicator:active, #panel .panel-button.screen-recording-indicator:checked {
+ box-shadow: inset 0 0 0 100px #e02a37; }
+ #panel .panel-button.screen-recording-indicator:active:hover, #panel .panel-button.screen-recording-indicator:checked:hover {
+ box-shadow: inset 0 0 0 100px #e13340; }
+ #panel .panel-button.screen-sharing-indicator {
+ transition-duration: 150ms;
+ border: 3px solid transparent;
+ background-color: transparent;
+ border-radius: 999px;
+ font-weight: bold;
- color: whitesmoke;
++ color: #fafafb;
+ box-shadow: inset 0 0 0 100px #ff7800; }
+ #panel .panel-button.screen-sharing-indicator:focus, #panel .panel-button.screen-sharing-indicator:hover {
+ box-shadow: inset 0 0 0 100px #ff861a; }
+ #panel .panel-button.screen-sharing-indicator:active, #panel .panel-button.screen-sharing-indicator:checked {
+ box-shadow: inset 0 0 0 100px #ff902e; }
+ #panel .panel-button.screen-sharing-indicator:active:hover, #panel .panel-button.screen-sharing-indicator:checked:hover {
+ box-shadow: inset 0 0 0 100px #ff9638; }
+ #panel .panel-button.clock-display {
+ transition-duration: 150ms;
+ border: 3px solid transparent;
+ background-color: transparent;
+ border-radius: 999px;
+ font-weight: bold;
+ color: #ffffff;
+ box-shadow: inset 0 0 0 100px transparent;
+ background: none !important;
+ box-shadow: none !important;
+ border: none !important; }
+ #panel .panel-button.clock-display:focus, #panel .panel-button.clock-display:hover {
+ box-shadow: inset 0 0 0 100px rgba(255, 255, 255, 0.17); }
+ #panel .panel-button.clock-display:active, #panel .panel-button.clock-display:checked {
+ box-shadow: inset 0 0 0 100px rgba(255, 255, 255, 0.28); }
+ #panel .panel-button.clock-display:active:hover, #panel .panel-button.clock-display:checked:hover {
+ box-shadow: inset 0 0 0 100px rgba(255, 255, 255, 0.32); }
+ #panel .panel-button.clock-display .clock {
+ transition-duration: 150ms;
+ border: 3px solid transparent;
+ border-radius: 999px; }
+ #panel .panel-button.clock-display:focus .clock, #panel .panel-button.clock-display:hover .clock {
+ box-shadow: inset 0 0 0 100px rgba(255, 255, 255, 0.17); }
+ #panel .panel-button.clock-display:active .clock, #panel .panel-button.clock-display:checked .clock {
+ box-shadow: inset 0 0 0 100px rgba(255, 255, 255, 0.28); }
+ #panel .panel-button.clock-display:active .clock:hover, #panel .panel-button.clock-display:checked .clock:hover {
+ box-shadow: inset 0 0 0 100px rgba(255, 255, 255, 0.32); }
+ #panel .panel-button.clock-display .messages-indicator {
+ icon-size: 1.091em; }
+ #panel:overview, #panel.unlock-screen, #panel.login-screen {
+ background-color: transparent; }
+ #panel:overview .panel-button.screen-recording-indicator, #panel.unlock-screen .panel-button.screen-recording-indicator, #panel.login-screen .panel-button.screen-recording-indicator {
+ transition-duration: 150ms;
+ border: 3px solid transparent;
+ background-color: transparent;
+ border-radius: 999px;
+ font-weight: bold;
- color: whitesmoke;
++ color: #fafafb;
+ box-shadow: inset 0 0 0 100px #c01c28; }
+ #panel:overview .panel-button.screen-recording-indicator:focus, #panel:overview .panel-button.screen-recording-indicator:hover, #panel.unlock-screen .panel-button.screen-recording-indicator:focus, #panel.unlock-screen .panel-button.screen-recording-indicator:hover, #panel.login-screen .panel-button.screen-recording-indicator:focus, #panel.login-screen .panel-button.screen-recording-indicator:hover {
+ box-shadow: inset 0 0 0 100px #d61f2d; }
+ #panel:overview .panel-button.screen-recording-indicator:active, #panel:overview .panel-button.screen-recording-indicator:checked, #panel.unlock-screen .panel-button.screen-recording-indicator:active, #panel.unlock-screen .panel-button.screen-recording-indicator:checked, #panel.login-screen .panel-button.screen-recording-indicator:active, #panel.login-screen .panel-button.screen-recording-indicator:checked {
+ box-shadow: inset 0 0 0 100px #e02a37; }
+ #panel:overview .panel-button.screen-recording-indicator:active:hover, #panel:overview .panel-button.screen-recording-indicator:checked:hover, #panel.unlock-screen .panel-button.screen-recording-indicator:active:hover, #panel.unlock-screen .panel-button.screen-recording-indicator:checked:hover, #panel.login-screen .panel-button.screen-recording-indicator:active:hover, #panel.login-screen .panel-button.screen-recording-indicator:checked:hover {
+ box-shadow: inset 0 0 0 100px #e13340; }
+ #panel:overview .panel-button.screen-sharing-indicator, #panel.unlock-screen .panel-button.screen-sharing-indicator, #panel.login-screen .panel-button.screen-sharing-indicator {
+ transition-duration: 150ms;
+ border: 3px solid transparent;
+ background-color: transparent;
+ border-radius: 999px;
+ font-weight: bold;
- .quick-toggle, .quick-menu-toggle {
++ color: #fafafb;
+ box-shadow: inset 0 0 0 100px #ff7800; }
+ #panel:overview .panel-button.screen-sharing-indicator:focus, #panel:overview .panel-button.screen-sharing-indicator:hover, #panel.unlock-screen .panel-button.screen-sharing-indicator:focus, #panel.unlock-screen .panel-button.screen-sharing-indicator:hover, #panel.login-screen .panel-button.screen-sharing-indicator:focus, #panel.login-screen .panel-button.screen-sharing-indicator:hover {
+ box-shadow: inset 0 0 0 100px #ff861a; }
+ #panel:overview .panel-button.screen-sharing-indicator:active, #panel:overview .panel-button.screen-sharing-indicator:checked, #panel.unlock-screen .panel-button.screen-sharing-indicator:active, #panel.unlock-screen .panel-button.screen-sharing-indicator:checked, #panel.login-screen .panel-button.screen-sharing-indicator:active, #panel.login-screen .panel-button.screen-sharing-indicator:checked {
+ box-shadow: inset 0 0 0 100px #ff902e; }
+ #panel:overview .panel-button.screen-sharing-indicator:active:hover, #panel:overview .panel-button.screen-sharing-indicator:checked:hover, #panel.unlock-screen .panel-button.screen-sharing-indicator:active:hover, #panel.unlock-screen .panel-button.screen-sharing-indicator:checked:hover, #panel.login-screen .panel-button.screen-sharing-indicator:active:hover, #panel.login-screen .panel-button.screen-sharing-indicator:checked:hover {
+ box-shadow: inset 0 0 0 100px #ff9638; }
+ #panel.unlock-screen .panel-button, #panel.login-screen .panel-button {
+ transition-duration: 150ms;
+ border: 3px solid transparent;
+ background-color: transparent;
+ border-radius: 999px;
+ font-weight: bold;
+ color: #ffffff;
+ box-shadow: inset 0 0 0 100px transparent; }
+ #panel.unlock-screen .panel-button:focus, #panel.unlock-screen .panel-button:hover, #panel.login-screen .panel-button:focus, #panel.login-screen .panel-button:hover {
+ box-shadow: inset 0 0 0 100px rgba(255, 255, 255, 0.17); }
+ #panel.unlock-screen .panel-button:active, #panel.unlock-screen .panel-button:checked, #panel.login-screen .panel-button:active, #panel.login-screen .panel-button:checked {
+ box-shadow: inset 0 0 0 100px rgba(255, 255, 255, 0.28); }
+ #panel.unlock-screen .panel-button:active:hover, #panel.unlock-screen .panel-button:checked:hover, #panel.login-screen .panel-button:active:hover, #panel.login-screen .panel-button:checked:hover {
+ box-shadow: inset 0 0 0 100px rgba(255, 255, 255, 0.32); }
+ #panel.unlock-screen .panel-button.clock-display, #panel.login-screen .panel-button.clock-display {
+ transition-duration: 150ms;
+ border: 3px solid transparent;
+ background-color: transparent;
+ border-radius: 999px;
+ font-weight: bold;
+ color: #ffffff;
+ box-shadow: inset 0 0 0 100px transparent;
+ background: none !important;
+ box-shadow: none !important;
+ border: none !important; }
+ #panel.unlock-screen .panel-button.clock-display:focus, #panel.unlock-screen .panel-button.clock-display:hover, #panel.login-screen .panel-button.clock-display:focus, #panel.login-screen .panel-button.clock-display:hover {
+ box-shadow: inset 0 0 0 100px rgba(255, 255, 255, 0.17); }
+ #panel.unlock-screen .panel-button.clock-display:active, #panel.unlock-screen .panel-button.clock-display:checked, #panel.login-screen .panel-button.clock-display:active, #panel.login-screen .panel-button.clock-display:checked {
+ box-shadow: inset 0 0 0 100px rgba(255, 255, 255, 0.28); }
+ #panel.unlock-screen .panel-button.clock-display:active:hover, #panel.unlock-screen .panel-button.clock-display:checked:hover, #panel.login-screen .panel-button.clock-display:active:hover, #panel.login-screen .panel-button.clock-display:checked:hover {
+ box-shadow: inset 0 0 0 100px rgba(255, 255, 255, 0.32); }
+ #panel.unlock-screen .panel-button.clock-display .clock, #panel.login-screen .panel-button.clock-display .clock {
+ transition-duration: 150ms;
+ border: 3px solid transparent;
+ border-radius: 999px; }
+ #panel.unlock-screen .panel-button.clock-display:focus .clock, #panel.unlock-screen .panel-button.clock-display:hover .clock, #panel.login-screen .panel-button.clock-display:focus .clock, #panel.login-screen .panel-button.clock-display:hover .clock {
+ box-shadow: inset 0 0 0 100px rgba(255, 255, 255, 0.17); }
+ #panel.unlock-screen .panel-button.clock-display:active .clock, #panel.unlock-screen .panel-button.clock-display:checked .clock, #panel.login-screen .panel-button.clock-display:active .clock, #panel.login-screen .panel-button.clock-display:checked .clock {
+ box-shadow: inset 0 0 0 100px rgba(255, 255, 255, 0.28); }
+ #panel.unlock-screen .panel-button.clock-display:active .clock:hover, #panel.unlock-screen .panel-button.clock-display:checked .clock:hover, #panel.login-screen .panel-button.clock-display:active .clock:hover, #panel.login-screen .panel-button.clock-display:checked .clock:hover {
+ box-shadow: inset 0 0 0 100px rgba(255, 255, 255, 0.32); }
+ #panel:overview .panel-button {
+ transition-duration: 150ms;
+ border: 3px solid transparent;
+ background-color: transparent;
+ border-radius: 999px;
+ font-weight: bold;
+ color: #ffffff;
+ box-shadow: inset 0 0 0 100px transparent; }
+ #panel:overview .panel-button:focus, #panel:overview .panel-button:hover {
+ box-shadow: inset 0 0 0 100px rgba(255, 255, 255, 0.17); }
+ #panel:overview .panel-button:active, #panel:overview .panel-button:checked {
+ box-shadow: inset 0 0 0 100px rgba(255, 255, 255, 0.28); }
+ #panel:overview .panel-button:active:hover, #panel:overview .panel-button:checked:hover {
+ box-shadow: inset 0 0 0 100px rgba(255, 255, 255, 0.32); }
+ #panel:overview .panel-button#panelActivities .workspace-dot {
+ background-color: #ffffff; }
+ #panel:overview .panel-button.clock-display {
+ transition-duration: 150ms;
+ border: 3px solid transparent;
+ background-color: transparent;
+ border-radius: 999px;
+ font-weight: bold;
+ color: #ffffff;
+ box-shadow: inset 0 0 0 100px transparent;
+ background: none !important;
+ box-shadow: none !important;
+ border: none !important; }
+ #panel:overview .panel-button.clock-display:focus, #panel:overview .panel-button.clock-display:hover {
+ box-shadow: inset 0 0 0 100px rgba(255, 255, 255, 0.17); }
+ #panel:overview .panel-button.clock-display:active, #panel:overview .panel-button.clock-display:checked {
+ box-shadow: inset 0 0 0 100px rgba(255, 255, 255, 0.28); }
+ #panel:overview .panel-button.clock-display:active:hover, #panel:overview .panel-button.clock-display:checked:hover {
+ box-shadow: inset 0 0 0 100px rgba(255, 255, 255, 0.32); }
+ #panel:overview .panel-button.clock-display .clock {
+ transition-duration: 150ms;
+ border: 3px solid transparent;
+ border-radius: 999px; }
+ #panel:overview .panel-button.clock-display:focus .clock, #panel:overview .panel-button.clock-display:hover .clock {
+ box-shadow: inset 0 0 0 100px rgba(255, 255, 255, 0.17); }
+ #panel:overview .panel-button.clock-display:active .clock, #panel:overview .panel-button.clock-display:checked .clock {
+ box-shadow: inset 0 0 0 100px rgba(255, 255, 255, 0.28); }
+ #panel:overview .panel-button.clock-display:active .clock:hover, #panel:overview .panel-button.clock-display:checked .clock:hover {
+ box-shadow: inset 0 0 0 100px rgba(255, 255, 255, 0.32); }
+ #panel .panel-status-indicators-box,
+ #panel .panel-status-menu-box {
+ spacing: 2px; }
+ #panel .power-status.panel-status-indicators-box {
+ spacing: 0; }
+ #panel .privacy-indicator {
+ color: #ff7800; }
+
+#appMenu {
+ spacing: 0.409em; }
+ #appMenu .label-shadow {
+ color: transparent; }
+
+#appMenu .panel-status-menu-box {
+ padding: 0 0.409em;
+ spacing: 0.409em; }
+
+.clock-display-box {
+ spacing: 2px; }
+ .clock-display-box .clock {
+ padding-left: 0.818em;
+ padding-right: 0.818em; }
+
+/* Activities Ripple */
+.ripple-box {
+ background-color: rgba(255, 255, 255, 0.2);
+ box-shadow: 0 0 2px 2px rgba(255, 255, 255, 0.2);
+ width: 52px;
+ height: 52px;
+ border-radius: 0 0 52px 0; }
+ .ripple-box:rtl {
+ border-radius: 0 0 0 52px; }
+
+.quick-settings {
+ padding: 18px;
+ border-radius: 36px; }
+ .quick-settings .icon-button, .quick-settings .login-dialog-button.cancel-button, .quick-settings .login-dialog-button.switch-user-button, .quick-settings .login-dialog-button.login-dialog-session-list-button, .quick-settings .calendar .calendar-month-header .pager-button, .calendar .calendar-month-header .quick-settings .pager-button, .quick-settings .message .message-header .message-expand-button, .message .message-header .quick-settings .message-expand-button,
+ .quick-settings .message .message-header .message-close-button,
+ .message .message-header .quick-settings .message-close-button, .quick-settings .screenshot-ui-show-pointer-button, .quick-settings .button {
+ padding: 10.5px; }
+
+.quick-settings-grid {
+ spacing-rows: 12px;
+ spacing-columns: 12px; }
+
- min-height: 3.273em;
- border: none; }
++.quick-toggle, .quick-toggle-has-menu {
+ border-radius: 999px;
+ min-width: 12em;
+ max-width: 12em;
- background-color: none;
++ min-height: 3.273em; }
+
+.quick-toggle {
- .quick-toggle .quick-toggle-title {
- font-weight: bold; }
- .quick-toggle StBoxLayout > .quick-toggle-subtitle {
+ /* Move padding into the box; this is to allow menu arrows
+ to extend to the border */ }
+ .quick-toggle > StBoxLayout {
+ spacing: 9px; }
+ .quick-toggle.button {
+ padding: 0; }
+ .quick-toggle > StBoxLayout {
+ padding: 0 12px; }
+ .quick-toggle:ltr > StBoxLayout {
+ padding-left: 15px; }
+ .quick-toggle:rtl > StBoxLayout {
+ padding-right: 15px; }
- .quick-menu-toggle .quick-toggle {
++ .quick-toggle .quick-toggle-subtitle {
+ font-weight: normal; }
+ .quick-toggle .quick-toggle-icon {
+ icon-size: 1.091em; }
+
- .quick-menu-toggle .quick-toggle:ltr {
++.quick-toggle-has-menu .quick-toggle {
+ min-width: auto;
+ max-width: auto; }
- .quick-menu-toggle .quick-toggle:ltr > StBoxLayout {
- padding-right: 0.6135em; }
- .quick-menu-toggle .quick-toggle:rtl {
++ .quick-toggle-has-menu .quick-toggle:ltr {
+ border-radius: 999px 0 0 999px; }
- .quick-menu-toggle .quick-toggle:rtr > StBoxLayout {
- padding-left: 0.6135em; }
- .quick-menu-toggle .quick-toggle:ltr:last-child {
++ .quick-toggle-has-menu .quick-toggle:ltr > StBoxLayout {
++ padding-right: 0.6135em; }
++ .quick-toggle-has-menu .quick-toggle:rtl {
+ border-radius: 0 999px 999px 0; }
- .quick-menu-toggle .quick-toggle:rtl:last-child {
++ .quick-toggle-has-menu .quick-toggle:rtl > StBoxLayout {
++ padding-left: 0.6135em; }
++ .quick-toggle-has-menu .quick-toggle:ltr:last-child {
+ border-radius: 999px; }
- .quick-menu-toggle .quick-toggle-arrow {
- padding: 0.409em 0.71575em;
- border-width: 0;
- border-color: rgba(255, 255, 255, 0.25); }
- .quick-menu-toggle .quick-toggle-arrow:checked {
- border-color: st-lighten(-st-accent-color, 30%); }
- .quick-menu-toggle .quick-toggle-arrow:ltr {
- border-radius: 0 999px 999px 0;
- border-left-width: 1px; }
- .quick-menu-toggle .quick-toggle-arrow:rtl {
- border-radius: 999px 0 0 999px;
- border-right-width: 1px; }
++ .quick-toggle-has-menu .quick-toggle:rtl:last-child {
+ border-radius: 999px; }
+
- box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.2) !important;
- background-color: st-mix(-st-accent-color, st-mix(st-mix(#ffffff, #1a1a1a, 9%), #ffffff, 87%), 5%); }
++.quick-toggle-has-menu .quick-toggle-menu-button {
++ padding: 0.409em 0.71575em; }
++ .quick-toggle-has-menu .quick-toggle-menu-button:ltr {
++ border-radius: 0 999px 999px 0; }
++ .quick-toggle-has-menu .quick-toggle-menu-button:rtl {
++ border-radius: 999px 0 0 999px; }
++
++.quick-toggle-has-menu .quick-toggle-separator {
++ width: 1px; }
++
++.quick-toggle-has-menu .quick-toggle-menu-button {
++ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
++ color: #ffffff;
++ background-color: st-mix(st-mix(#ffffff, #525252, 9%), #ffffff, 87%); }
++ .quick-toggle-has-menu .quick-toggle-menu-button:focus {
++ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
++ color: #ffffff;
++ box-shadow: inset 0 0 0 2px st-transparentize(st-mix(-st-accent-color, #ffffff, 60%), 0.1) !important;
++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(st-mix(#ffffff, #525252, 9%), #ffffff, 87%), 5%); }
++ .quick-toggle-has-menu .quick-toggle-menu-button:focus:hover {
++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(st-lighten(st-mix(#ffffff, #525252, 9%), 4%), #ffffff, 87%), 5%); }
++ .quick-toggle-has-menu .quick-toggle-menu-button:hover {
++ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
++ color: #ffffff;
++ background-color: st-mix(st-lighten(st-mix(#ffffff, #525252, 9%), 4%), #ffffff, 87%); }
++ .quick-toggle-has-menu .quick-toggle-menu-button:active {
++ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
++ color: #ffffff;
++ background-color: st-mix(st-lighten(st-mix(#ffffff, #525252, 9%), 9%), #ffffff, 87%); }
++ .quick-toggle-has-menu .quick-toggle-menu-button:active:hover {
++ background-color: st-lighten(st-lighten(st-mix(#ffffff, #525252, 9%), 9%), 4%); }
++ .quick-toggle-has-menu .quick-toggle-menu-button:active:focus {
++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(st-lighten(st-mix(#ffffff, #525252, 9%), 9%), #ffffff, 87%), 5%); }
++ .quick-toggle-has-menu .quick-toggle-menu-button:checked {
++ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
++ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
++ box-shadow: none;
++ border: none;
++ color: -st-accent-fg-color;
++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 75%), #ffffff, 87%); }
++ .quick-toggle-has-menu .quick-toggle-menu-button:checked:focus {
++ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
++ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
++ box-shadow: none;
++ border: none;
++ color: -st-accent-fg-color;
++ box-shadow: inset 0 0 0 2px st-transparentize(st-mix(-st-accent-color, #ffffff, 60%), 0.1) !important;
++ box-shadow: inset 0 0 0 2px st-transparentize(st-lighten(-st-accent-color, 30%), 0.1) !important;
++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(st-mix(-st-accent-color, #ffffff, 75%), #ffffff, 87%), 5%); }
++ .quick-toggle-has-menu .quick-toggle-menu-button:checked:focus:hover {
++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(st-lighten(st-mix(-st-accent-color, #ffffff, 75%), 4%), #ffffff, 87%), 5%); }
++ .quick-toggle-has-menu .quick-toggle-menu-button:checked:hover {
++ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
++ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
++ box-shadow: none;
++ border: none;
++ color: -st-accent-fg-color;
++ background-color: st-mix(st-lighten(st-mix(-st-accent-color, #ffffff, 75%), 4%), #ffffff, 87%); }
++ .quick-toggle-has-menu .quick-toggle-menu-button:checked:active {
++ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
++ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
++ box-shadow: none;
++ border: none;
++ color: -st-accent-fg-color;
++ background-color: st-mix(st-lighten(st-mix(-st-accent-color, #ffffff, 75%), 9%), #ffffff, 87%); }
++ .quick-toggle-has-menu .quick-toggle-menu-button:checked:active:hover {
++ background-color: st-lighten(st-lighten(st-mix(-st-accent-color, #ffffff, 75%), 9%), 4%); }
++ .quick-toggle-has-menu .quick-toggle-menu-button:checked:active:focus {
++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(st-lighten(st-mix(-st-accent-color, #ffffff, 75%), 9%), #ffffff, 87%), 5%); }
++
++.quick-toggle-has-menu:checked .quick-toggle-separator {
++ background-color: transparent; }
++
++.quick-toggle-has-menu .quick-toggle-separator {
++ background-color: transparent; }
+
+.quick-slider > StBoxLayout {
+ spacing: 6px; }
+
+.quick-slider .icon-button, .quick-slider .login-dialog-button.cancel-button, .quick-slider .login-dialog-button.switch-user-button, .quick-slider .login-dialog-button.login-dialog-session-list-button, .quick-slider .calendar .calendar-month-header .pager-button, .calendar .calendar-month-header .quick-slider .pager-button, .quick-slider .message .message-header .message-expand-button, .message .message-header .quick-slider .message-expand-button,
+.quick-slider .message .message-header .message-close-button,
+.message .message-header .quick-slider .message-close-button, .quick-slider .screenshot-ui-show-pointer-button {
+ padding: 6px; }
+
+.quick-slider .slider-bin {
+ padding: 6px;
+ border-radius: 999px; }
+ .quick-slider .slider-bin:focus {
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
+ color: #ffffff;
- background-color: st-mix(-st-accent-color, st-mix(st-lighten(st-mix(#ffffff, #1a1a1a, 9%), 4%), #ffffff, 87%), 5%); }
++ box-shadow: inset 0 0 0 2px st-transparentize(st-mix(-st-accent-color, #ffffff, 60%), 0.1) !important;
++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(st-mix(#ffffff, #1a1a1a, 9%), #ffffff, 87%), 5%); }
+ .quick-slider .slider-bin:focus:hover {
- box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.2) !important;
- background-color: st-mix(-st-accent-color, rgba(37, 37, 37, 0.25), 5%); }
++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(st-lighten(st-mix(#ffffff, #1a1a1a, 9%), 4%), #ffffff, 87%), 5%); }
+
+.quick-toggle-menu {
+ border-radius: 24px;
+ margin: 12px 18px 0; }
+ .quick-toggle-menu:insensitive {
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
+ color: #ffffff;
+ background-color: st-mix(st-mix(#ffffff, #1a1a1a, 9%), #ffffff, 87%); }
+ .quick-toggle-menu .popup-menu-item > StIcon {
+ -st-icon-style: symbolic;
+ icon-size: 1.091em; }
+ .quick-toggle-menu .header {
+ spacing-rows: 3px;
+ spacing-columns: 12px;
+ padding-bottom: 12px; }
+ .quick-toggle-menu .header .icon {
+ icon-size: 1.6365em;
+ border-radius: 999px;
+ padding: 9px;
+ background-color: rgba(255, 255, 255, 0.2);
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); }
+ .quick-toggle-menu .header .icon.active {
+ background-color: -st-accent-color;
+ color: -st-accent-fg-color; }
+ .quick-toggle-menu .header .icon.active {
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
+ box-shadow: none;
+ border: none; }
+
+.quick-settings-system-item > StBoxLayout {
+ spacing: 12px; }
+
+.quick-settings-system-item .power-item {
+ min-height: 0;
+ min-width: 0; }
+ .quick-settings-system-item .power-item:insensitive {
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
+ color: #ffffff;
+ background-color: st-mix(st-mix(#ffffff, #1a1a1a, 9%), #ffffff, 87%);
+ background-color: transparent; }
+
+.nm-network-item .wireless-secure-icon {
+ icon-size: 0.5455em; }
+
+.bt-device-item .popup-menu-icon {
+ -st-icon-style: symbolic; }
+
+.bt-menu-placeholder.popup-menu-item {
+ text-align: center;
+ padding: 2em 4em; }
+
+.device-subtitle {
+ color: rgba(255, 255, 255, 0.5); }
+
+.keyboard-brightness-level {
+ spacing: 6px; }
+
+.background-apps-quick-toggle {
+ min-height: 2.728em;
+ background-color: transparent; }
+ .background-apps-quick-toggle StIcon {
+ icon-size: 1.091em !important; }
+
+.background-app-item .popup-menu-icon {
+ icon-size: 32px !important;
+ -st-icon-style: regular !important; }
+
+.background-app-item .icon-button, .background-app-item .login-dialog-button.cancel-button, .background-app-item .login-dialog-button.switch-user-button, .background-app-item .login-dialog-button.login-dialog-session-list-button, .background-app-item .calendar .calendar-month-header .pager-button, .calendar .calendar-month-header .background-app-item .pager-button, .background-app-item .message .message-header .message-expand-button, .message .message-header .background-app-item .message-expand-button,
+.background-app-item .message .message-header .message-close-button,
+.message .message-header .background-app-item .message-close-button, .background-app-item .screenshot-ui-show-pointer-button {
+ padding: 6px;
+ background-color: rgba(255, 255, 255, 0.13); }
+ .background-app-item .icon-button:hover, .background-app-item .login-dialog-button.cancel-button:hover, .background-app-item .login-dialog-button.switch-user-button:hover, .background-app-item .login-dialog-button.login-dialog-session-list-button:hover, .background-app-item .calendar .calendar-month-header .pager-button:hover, .calendar .calendar-month-header .background-app-item .pager-button:hover, .background-app-item .message .message-header .message-expand-button:hover, .message .message-header .background-app-item .message-expand-button:hover,
+ .background-app-item .message .message-header .message-close-button:hover,
+ .message .message-header .background-app-item .message-close-button:hover, .background-app-item .screenshot-ui-show-pointer-button:hover {
+ background-color: rgba(255, 255, 255, 0.22); }
+ .background-app-item .icon-button:active, .background-app-item .login-dialog-button.cancel-button:active, .background-app-item .login-dialog-button.switch-user-button:active, .background-app-item .login-dialog-button.login-dialog-session-list-button:active, .background-app-item .calendar .calendar-month-header .pager-button:active, .calendar .calendar-month-header .background-app-item .pager-button:active, .background-app-item .message .message-header .message-expand-button:active, .message .message-header .background-app-item .message-expand-button:active,
+ .background-app-item .message .message-header .message-close-button:active,
+ .message .message-header .background-app-item .message-close-button:active, .background-app-item .screenshot-ui-show-pointer-button:active {
+ background-color: rgba(255, 255, 255, 0.31); }
+
+.background-app-item .spinner {
+ padding: 6px; }
+
+.background-app-item.popup-inactive-menu-item {
+ color: #ffffff; }
+
+/* OVERVIEW */
+.secondary-monitor-workspaces {
+ spacing: 12px; }
+
+#overviewGroup {
+ background-color: #000000; }
+
+/* Window Picker */
+.window-picker {
+ spacing: 6px; }
+
+.window-icon {
+ background-color: #000000;
+ padding: 12px;
+ border-radius: 16px;
+ border: 2px solid rgba(255, 255, 255, 0.4);
+ margin: 18px; }
+
+.window-close, .screenshot-ui-close-button {
+ background-color: rgba(31, 31, 31, 0.98);
+ color: #ffffff;
+ border-radius: 999px;
+ box-shadow: 0 2px 4px 0 transparent;
+ padding: 3px;
+ height: 32px;
+ width: 32px;
+ transition-duration: 100ms;
+ border: 2px solid transparent;
+ border-color: rgba(255, 255, 255, 0.4); }
+ .window-close StIcon, .screenshot-ui-close-button StIcon {
+ icon-size: 24px; }
+ .window-close:hover, .screenshot-ui-close-button:hover {
+ background-color: rgba(48, 48, 48, 0.98); }
+ .window-close:active, .screenshot-ui-close-button:active {
+ background-color: rgba(64, 64, 64, 0.98); }
+
+.workspace-background {
+ border-radius: 30px;
+ background-color: rgba(3, 2, 1, 0);
+ box-shadow: 0 4px 16px 4px transparent; }
+
+.search-entry {
+ border-radius: 999px;
+ margin-top: 12px;
+ margin-bottom: 6px;
+ width: 24em; }
+ .search-entry .search-entry-icon {
+ icon-size: 1.091em;
+ margin-top: 2px;
+ padding: 0 4px; }
+
+/* Search */
+#searchResults {
+ margin: 0 4px; }
+
+#searchResultsContent {
+ max-width: 1044px; }
+
+.search-section {
+ spacing: 18px; }
+ .search-section .search-section-separator {
+ height: 8px;
+ background-color: transparent; }
+
+.search-section-content {
+ background-color: #252525;
+ color: #ffffff;
+ border-radius: 24px;
+ padding: 12px;
+ margin: 0 12px;
+ border: 2px solid transparent;
+ border-color: rgba(255, 255, 255, 0.4); }
+
+.list-search-result, .search-provider-icon {
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
+ color: #ffffff;
+ background-color: #252525;
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
+ box-shadow: none;
+ border: none;
++ background-color: transparent;
+ border-radius: 13.2px; }
+ .list-search-result:focus, .search-provider-icon:focus {
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
+ color: #ffffff;
- background-color: st-mix(-st-accent-color, st-mix(st-lighten(#252525, 7%), #ffffff, 87%), 5%); }
++ box-shadow: inset 0 0 0 2px st-transparentize(st-mix(-st-accent-color, #ffffff, 60%), 0.1) !important;
++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), rgba(37, 37, 37, 0.25), 5%); }
+ .list-search-result:focus:hover, .search-provider-icon:focus:hover {
- background-color: st-mix(-st-accent-color, st-mix(st-lighten(#252525, 9%), #ffffff, 87%), 5%); }
++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(st-lighten(#252525, 7%), #ffffff, 87%), 5%); }
+ .list-search-result:hover, .search-provider-icon:hover {
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
+ color: #ffffff;
+ background-color: st-mix(st-lighten(#252525, 7%), #ffffff, 87%); }
+ .list-search-result:active, .search-provider-icon:active {
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
+ color: #ffffff;
+ background-color: st-mix(st-lighten(#252525, 9%), #ffffff, 87%); }
+ .list-search-result:active:hover, .search-provider-icon:active:hover {
+ background-color: st-lighten(st-lighten(#252525, 9%), 7%); }
+ .list-search-result:active:focus, .search-provider-icon:active:focus {
- box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.2) !important;
- background-color: st-mix(-st-accent-color, rgba(37, 37, 37, 0.25), 5%); }
++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(st-lighten(#252525, 9%), #ffffff, 87%), 5%); }
+ .list-search-result:highlighted, .search-provider-icon:highlighted, .list-search-result:selected, .search-provider-icon:selected, .list-search-result:checked, .search-provider-icon:checked {
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
+ color: #ffffff;
+ background-color: st-mix(st-lighten(#252525, 8%), #ffffff, 87%); }
+ .list-search-result:highlighted:hover, .search-provider-icon:highlighted:hover, .list-search-result:selected:hover, .search-provider-icon:selected:hover, .list-search-result:checked:hover, .search-provider-icon:checked:hover {
+ background-color: st-lighten(st-lighten(#252525, 8%), 7%); }
+ .list-search-result:highlighted:active, .search-provider-icon:highlighted:active, .list-search-result:selected:active, .search-provider-icon:selected:active, .list-search-result:checked:active, .search-provider-icon:checked:active {
+ background-color: st-lighten(st-lighten(#252525, 8%), 9%); }
+ .list-search-result:insensitive, .search-provider-icon:insensitive {
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
+ color: st-transparentize(#ffffff, 0.5);
+ background-color: #252525;
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
+ box-shadow: none;
+ border: none; }
+ .list-search-result:drop, .search-provider-icon:drop {
+ background-color: st-transparentize(-st-accent-color, 0.8);
+ box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.2); }
+
+.search-statustext {
+ color: rgba(255, 255, 255, 0.8); }
+
+.grid-search-results {
+ spacing: 30px; }
+
+.search-provider-icon:ltr {
+ margin-right: 4px; }
+
+.search-provider-icon:rtl {
+ margin-left: 4px; }
+
+.search-provider-icon .list-search-provider-content {
+ spacing: 12px; }
+ .search-provider-icon .list-search-provider-content .list-search-provider-details {
+ width: 120px;
+ color: #ffffff; }
+
+.list-search-results {
+ spacing: 6px; }
+
+.list-search-result .list-search-result-content {
+ spacing: 6px; }
+
+.list-search-result .list-search-result-title {
+ spacing: 12px;
+ font-weight: bold; }
+
+.list-search-result .list-search-result-description {
+ color: #868686;
+ color: #ffffff; }
+
+/* Dash */
+#dash {
+ padding-left: 6px;
+ padding-right: 6px; }
+ #dash .dash-background {
+ background-color: #252525;
+ border-radius: 28px;
+ padding-top: 12px;
+ padding-bottom: 12px;
+ padding-left: 10px;
+ padding-right: 10px;
+ box-shadow: inset 0 0 0 2px rgba(255, 255, 255, 0.4); }
+ #dash .dash-item-container .placeholder {
+ background-image: none;
+ background-size: contain;
+ height: 32px; }
+ #dash .dash-item-container .empty-dash-drop-target {
+ width: 32px;
+ height: 32px; }
+ #dash .dash-item-container .show-apps,
+ #dash .dash-item-container .overview-tile,
+ #dash .dash-item-container .grid-search-result {
+ margin: 0 2px;
+ padding-bottom: 12px; }
+ #dash .dash-item-container .show-apps .overview-icon,
+ #dash .dash-item-container .overview-tile .overview-icon,
+ #dash .dash-item-container .grid-search-result .overview-icon {
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
+ color: #ffffff;
+ background-color: #252525;
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
+ box-shadow: none;
+ border: none; }
+ #dash .dash-item-container .show-apps:focus .overview-icon,
+ #dash .dash-item-container .overview-tile:focus .overview-icon,
+ #dash .dash-item-container .grid-search-result:focus .overview-icon {
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
+ color: #ffffff;
- background-color: st-mix(-st-accent-color, st-mix(st-lighten(#252525, 7%), #ffffff, 87%), 5%); }
++ box-shadow: inset 0 0 0 2px st-transparentize(st-mix(-st-accent-color, #ffffff, 60%), 0.1) !important;
++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), rgba(37, 37, 37, 0.25), 5%); }
+ #dash .dash-item-container .show-apps:focus .overview-icon:hover,
+ #dash .dash-item-container .overview-tile:focus .overview-icon:hover,
+ #dash .dash-item-container .grid-search-result:focus .overview-icon:hover {
- background-color: st-mix(-st-accent-color, st-mix(st-lighten(#252525, 9%), #ffffff, 87%), 5%); }
++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(st-lighten(#252525, 7%), #ffffff, 87%), 5%); }
+ #dash .dash-item-container .show-apps:hover .overview-icon,
+ #dash .dash-item-container .overview-tile:hover .overview-icon,
+ #dash .dash-item-container .grid-search-result:hover .overview-icon {
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
+ color: #ffffff;
+ background-color: st-mix(st-lighten(#252525, 7%), #ffffff, 87%); }
+ #dash .dash-item-container .show-apps:active .overview-icon,
+ #dash .dash-item-container .overview-tile:active .overview-icon,
+ #dash .dash-item-container .grid-search-result:active .overview-icon {
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
+ color: #ffffff;
+ background-color: st-mix(st-lighten(#252525, 9%), #ffffff, 87%); }
+ #dash .dash-item-container .show-apps:active .overview-icon:hover,
+ #dash .dash-item-container .overview-tile:active .overview-icon:hover,
+ #dash .dash-item-container .grid-search-result:active .overview-icon:hover {
+ background-color: st-lighten(st-lighten(#252525, 9%), 7%); }
+ #dash .dash-item-container .show-apps:active .overview-icon:focus,
+ #dash .dash-item-container .overview-tile:active .overview-icon:focus,
+ #dash .dash-item-container .grid-search-result:active .overview-icon:focus {
- box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.2) !important;
- background-color: st-mix(-st-accent-color, rgba(0, 0, 0, 0.25), 5%); }
++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(st-lighten(#252525, 9%), #ffffff, 87%), 5%); }
+ #dash .dash-item-container .show-apps:checked .overview-icon,
+ #dash .dash-item-container .overview-tile:checked .overview-icon,
+ #dash .dash-item-container .grid-search-result:checked .overview-icon {
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
+ color: #ffffff;
+ background-color: st-mix(st-lighten(#252525, 8%), #ffffff, 87%); }
+ #dash .dash-item-container .show-apps:checked .overview-icon:hover,
+ #dash .dash-item-container .overview-tile:checked .overview-icon:hover,
+ #dash .dash-item-container .grid-search-result:checked .overview-icon:hover {
+ background-color: st-lighten(st-lighten(#252525, 8%), 7%); }
+ #dash .dash-item-container .show-apps:checked .overview-icon:active,
+ #dash .dash-item-container .overview-tile:checked .overview-icon:active,
+ #dash .dash-item-container .grid-search-result:checked .overview-icon:active {
+ background-color: st-lighten(st-lighten(#252525, 8%), 9%); }
+ #dash .dash-item-container .app-grid-running-dot {
+ offset-y: -13px; }
+ #dash .dash-separator {
+ width: 1px;
+ margin-left: 4px;
+ margin-right: 4px;
+ background-color: rgba(255, 255, 255, 0.1);
+ width: 2px;
+ background-color: rgba(255, 255, 255, 0.4); }
+ #dash .dash-separator,
+ #dash .dash-background {
+ margin-bottom: 12px; }
+
+.dash-label {
+ -y-offset: 8px; }
+
+/* App Grid */
+.icon-grid {
+ row-spacing: 12px;
+ column-spacing: 12px;
+ max-row-spacing: 36px;
+ max-column-spacing: 36px;
+ page-padding-top: 24px;
+ page-padding-bottom: 24px;
+ page-padding-left: 18px;
+ page-padding-right: 18px; }
+
+/* App Icons */
+.overview-tile, .grid-search-result {
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
+ color: #ffffff;
+ background-color: #000000;
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
+ box-shadow: none;
+ border: none;
++ background-color: transparent;
+ border-radius: 24px;
+ padding: 12px; }
+ .overview-tile:focus, .grid-search-result:focus {
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
+ color: #ffffff;
- background-color: st-mix(-st-accent-color, st-mix(st-lighten(#000000, 7%), #ffffff, 87%), 5%); }
++ box-shadow: inset 0 0 0 2px st-transparentize(st-mix(-st-accent-color, #ffffff, 60%), 0.1) !important;
++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), rgba(0, 0, 0, 0.25), 5%); }
+ .overview-tile:focus:hover, .grid-search-result:focus:hover {
- background-color: st-mix(-st-accent-color, st-mix(st-lighten(#000000, 9%), #ffffff, 87%), 5%); }
++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(st-lighten(#000000, 7%), #ffffff, 87%), 5%); }
+ .overview-tile:hover, .grid-search-result:hover {
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
+ color: #ffffff;
+ background-color: st-mix(st-lighten(#000000, 7%), #ffffff, 87%); }
+ .overview-tile:active, .grid-search-result:active {
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
+ color: #ffffff;
+ background-color: st-mix(st-lighten(#000000, 9%), #ffffff, 87%); }
+ .overview-tile:active:hover, .grid-search-result:active:hover {
+ background-color: st-lighten(st-lighten(#000000, 9%), 7%); }
+ .overview-tile:active:focus, .grid-search-result:active:focus {
- box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.2) !important;
- background-color: st-mix(-st-accent-color, st-mix(st-mix(#ffffff, #000000, 9%), #ffffff, 87%), 5%); }
++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(st-lighten(#000000, 9%), #ffffff, 87%), 5%); }
+ .overview-tile:highlighted, .grid-search-result:highlighted, .overview-tile:selected, .grid-search-result:selected, .overview-tile:checked, .grid-search-result:checked {
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
+ color: #ffffff;
+ background-color: st-mix(st-lighten(#000000, 8%), #ffffff, 87%); }
+ .overview-tile:highlighted:hover, .grid-search-result:highlighted:hover, .overview-tile:selected:hover, .grid-search-result:selected:hover, .overview-tile:checked:hover, .grid-search-result:checked:hover {
+ background-color: st-lighten(st-lighten(#000000, 8%), 7%); }
+ .overview-tile:highlighted:active, .grid-search-result:highlighted:active, .overview-tile:selected:active, .grid-search-result:selected:active, .overview-tile:checked:active, .grid-search-result:checked:active {
+ background-color: st-lighten(st-lighten(#000000, 8%), 9%); }
+ .overview-tile:insensitive, .grid-search-result:insensitive {
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
+ color: st-transparentize(#ffffff, 0.5);
+ background-color: #000000;
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
+ box-shadow: none;
+ border: none; }
+ .overview-tile:drop, .grid-search-result:drop {
+ background-color: st-transparentize(-st-accent-color, 0.8);
+ box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.2); }
+ .overview-tile .overview-icon.overview-icon-with-label > StBoxLayout, .grid-search-result .overview-icon.overview-icon-with-label > StBoxLayout {
+ spacing: 6px; }
+
+.app-folder {
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
+ color: #ffffff;
+ background-color: st-mix(st-mix(#ffffff, #000000, 9%), #ffffff, 87%); }
+ .app-folder:focus {
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
+ color: #ffffff;
- background-color: st-mix(-st-accent-color, st-mix(st-lighten(st-mix(#ffffff, #000000, 9%), 4%), #ffffff, 87%), 5%); }
++ box-shadow: inset 0 0 0 2px st-transparentize(st-mix(-st-accent-color, #ffffff, 60%), 0.1) !important;
++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(st-mix(#ffffff, #000000, 9%), #ffffff, 87%), 5%); }
+ .app-folder:focus:hover {
- background-color: st-mix(-st-accent-color, st-mix(st-lighten(st-mix(#ffffff, #000000, 9%), 9%), #ffffff, 87%), 5%); }
++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(st-lighten(st-mix(#ffffff, #000000, 9%), 4%), #ffffff, 87%), 5%); }
+ .app-folder:hover {
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
+ color: #ffffff;
+ background-color: st-mix(st-lighten(st-mix(#ffffff, #000000, 9%), 4%), #ffffff, 87%); }
+ .app-folder:active {
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
+ color: #ffffff;
+ background-color: st-mix(st-lighten(st-mix(#ffffff, #000000, 9%), 9%), #ffffff, 87%); }
+ .app-folder:active:hover {
+ background-color: st-lighten(st-lighten(st-mix(#ffffff, #000000, 9%), 9%), 4%); }
+ .app-folder:active:focus {
- background-color: st-mix(-st-accent-color, st-mix(st-lighten(st-mix(#ffffff, #252525, 9%), 9%), #ffffff, 87%), 5%); }
++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(st-lighten(st-mix(#ffffff, #000000, 9%), 9%), #ffffff, 87%), 5%); }
+ .app-folder:highlighted, .app-folder:selected, .app-folder:checked {
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
+ color: #ffffff;
+ background-color: st-mix(st-lighten(st-mix(#ffffff, #000000, 9%), 8%), #ffffff, 87%); }
+ .app-folder:highlighted:hover, .app-folder:selected:hover, .app-folder:checked:hover {
+ background-color: st-lighten(st-lighten(st-mix(#ffffff, #000000, 9%), 8%), 4%); }
+ .app-folder:highlighted:active, .app-folder:selected:active, .app-folder:checked:active {
+ background-color: st-lighten(st-lighten(st-mix(#ffffff, #000000, 9%), 8%), 9%); }
+ .app-folder:insensitive {
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
+ color: st-transparentize(#ffffff, 0.5);
+ background-color: st-darken(st-mix(#ffffff, #000000, 9%), 3%);
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
+ box-shadow: none;
+ border: none; }
+ .app-folder:drop {
+ background-color: st-transparentize(-st-accent-color, 0.8);
+ box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.2); }
+
+.app-grid-running-dot {
+ height: 5px;
+ width: 5px;
+ border-radius: 5px;
+ background-color: #ffffff;
+ offset-y: 6px; }
+
+.app-folder-dialog-container {
+ padding-top: 2.2em; }
+
+.app-folder-dialog {
+ width: 720px;
+ height: 720px;
+ border-radius: 64px;
+ background-color: #252525;
+ color: #ffffff;
+ padding: 0 2px;
+ box-shadow: inset 0 0 0 2px rgba(255, 255, 255, 0.4); }
+ .app-folder-dialog .folder-name-container {
+ padding: 24px 36px;
+ padding-bottom: 0; }
+ .app-folder-dialog .folder-name-container .folder-name-entry {
+ width: 12em; }
+ .app-folder-dialog .icon-button, .app-folder-dialog .login-dialog-button.cancel-button, .app-folder-dialog .login-dialog-button.switch-user-button, .app-folder-dialog .login-dialog-button.login-dialog-session-list-button, .app-folder-dialog .calendar .calendar-month-header .pager-button, .calendar .calendar-month-header .app-folder-dialog .pager-button, .app-folder-dialog .message .message-header .message-expand-button, .message .message-header .app-folder-dialog .message-expand-button,
+ .app-folder-dialog .message .message-header .message-close-button,
+ .message .message-header .app-folder-dialog .message-close-button, .app-folder-dialog .screenshot-ui-show-pointer-button {
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
+ color: #ffffff;
+ background-color: st-mix(st-mix(#ffffff, #252525, 9%), #ffffff, 87%); }
+ .app-folder-dialog .icon-button:hover, .app-folder-dialog .login-dialog-button.cancel-button:hover, .app-folder-dialog .login-dialog-button.switch-user-button:hover, .app-folder-dialog .login-dialog-button.login-dialog-session-list-button:hover, .app-folder-dialog .calendar .calendar-month-header .pager-button:hover, .calendar .calendar-month-header .app-folder-dialog .pager-button:hover, .app-folder-dialog .message .message-header .message-expand-button:hover, .message .message-header .app-folder-dialog .message-expand-button:hover,
+ .app-folder-dialog .message .message-header .message-close-button:hover,
+ .message .message-header .app-folder-dialog .message-close-button:hover, .app-folder-dialog .screenshot-ui-show-pointer-button:hover {
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
+ color: #ffffff;
+ background-color: st-mix(st-lighten(st-mix(#ffffff, #252525, 9%), 4%), #ffffff, 87%); }
+ .app-folder-dialog .icon-button:active, .app-folder-dialog .login-dialog-button.cancel-button:active, .app-folder-dialog .login-dialog-button.switch-user-button:active, .app-folder-dialog .login-dialog-button.login-dialog-session-list-button:active, .app-folder-dialog .calendar .calendar-month-header .pager-button:active, .calendar .calendar-month-header .app-folder-dialog .pager-button:active, .app-folder-dialog .message .message-header .message-expand-button:active, .message .message-header .app-folder-dialog .message-expand-button:active,
+ .app-folder-dialog .message .message-header .message-close-button:active,
+ .message .message-header .app-folder-dialog .message-close-button:active, .app-folder-dialog .screenshot-ui-show-pointer-button:active {
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
+ color: #ffffff;
+ background-color: st-mix(st-lighten(st-mix(#ffffff, #252525, 9%), 9%), #ffffff, 87%); }
+ .app-folder-dialog .icon-button:active:hover, .app-folder-dialog .login-dialog-button.cancel-button:active:hover, .app-folder-dialog .login-dialog-button.switch-user-button:active:hover, .app-folder-dialog .login-dialog-button.login-dialog-session-list-button:active:hover, .app-folder-dialog .calendar .calendar-month-header .pager-button:active:hover, .calendar .calendar-month-header .app-folder-dialog .pager-button:active:hover, .app-folder-dialog .message .message-header .message-expand-button:active:hover, .message .message-header .app-folder-dialog .message-expand-button:active:hover,
+ .app-folder-dialog .message .message-header .message-close-button:active:hover,
+ .message .message-header .app-folder-dialog .message-close-button:active:hover, .app-folder-dialog .screenshot-ui-show-pointer-button:active:hover {
+ background-color: st-lighten(st-lighten(st-mix(#ffffff, #252525, 9%), 9%), 4%); }
+ .app-folder-dialog .icon-button:active:focus, .app-folder-dialog .login-dialog-button.cancel-button:active:focus, .app-folder-dialog .login-dialog-button.switch-user-button:active:focus, .app-folder-dialog .login-dialog-button.login-dialog-session-list-button:active:focus, .app-folder-dialog .calendar .calendar-month-header .pager-button:active:focus, .calendar .calendar-month-header .app-folder-dialog .pager-button:active:focus, .app-folder-dialog .message .message-header .message-expand-button:active:focus, .message .message-header .app-folder-dialog .message-expand-button:active:focus,
+ .app-folder-dialog .message .message-header .message-close-button:active:focus,
+ .message .message-header .app-folder-dialog .message-close-button:active:focus, .app-folder-dialog .screenshot-ui-show-pointer-button:active:focus {
- background-color: st-mix(-st-accent-color, st-mix(st-lighten(#252525, 9%), #ffffff, 87%), 5%); }
++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(st-lighten(st-mix(#ffffff, #252525, 9%), 9%), #ffffff, 87%), 5%); }
+ .app-folder-dialog .page-indicators {
+ margin-bottom: 24px; }
+ .app-folder-dialog .page-navigation-arrow {
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
+ color: #ffffff;
+ background-color: #252525;
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
+ box-shadow: none;
+ border: none; }
+ .app-folder-dialog .page-navigation-arrow:hover {
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
+ color: #ffffff;
+ background-color: st-mix(st-lighten(#252525, 7%), #ffffff, 87%); }
+ .app-folder-dialog .page-navigation-arrow:active {
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
+ color: #ffffff;
+ background-color: st-mix(st-lighten(#252525, 9%), #ffffff, 87%); }
+ .app-folder-dialog .page-navigation-arrow:active:hover {
+ background-color: st-lighten(st-lighten(#252525, 9%), 7%); }
+ .app-folder-dialog .page-navigation-arrow:active:focus {
- border: none; }
++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(st-lighten(#252525, 9%), #ffffff, 87%), 5%); }
+ .app-folder-dialog .overview-tile, .app-folder-dialog .grid-search-result {
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
+ color: #ffffff;
+ background-color: #252525;
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
+ box-shadow: none;
- box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.2) !important;
- background-color: st-mix(-st-accent-color, rgba(37, 37, 37, 0.25), 5%); }
++ border: none;
++ background-color: transparent; }
+ .app-folder-dialog .overview-tile:focus, .app-folder-dialog .grid-search-result:focus {
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
+ color: #ffffff;
- background-color: st-mix(-st-accent-color, st-mix(st-lighten(#252525, 7%), #ffffff, 87%), 5%); }
++ box-shadow: inset 0 0 0 2px st-transparentize(st-mix(-st-accent-color, #ffffff, 60%), 0.1) !important;
++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), rgba(37, 37, 37, 0.25), 5%); }
+ .app-folder-dialog .overview-tile:focus:hover, .app-folder-dialog .grid-search-result:focus:hover {
- background-color: st-mix(-st-accent-color, st-mix(st-lighten(#252525, 9%), #ffffff, 87%), 5%); }
++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(st-lighten(#252525, 7%), #ffffff, 87%), 5%); }
+ .app-folder-dialog .overview-tile:hover, .app-folder-dialog .grid-search-result:hover {
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
+ color: #ffffff;
+ background-color: st-mix(st-lighten(#252525, 7%), #ffffff, 87%); }
+ .app-folder-dialog .overview-tile:active, .app-folder-dialog .grid-search-result:active {
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
+ color: #ffffff;
+ background-color: st-mix(st-lighten(#252525, 9%), #ffffff, 87%); }
+ .app-folder-dialog .overview-tile:active:hover, .app-folder-dialog .grid-search-result:active:hover {
+ background-color: st-lighten(st-lighten(#252525, 9%), 7%); }
+ .app-folder-dialog .overview-tile:active:focus, .app-folder-dialog .grid-search-result:active:focus {
- background-color: st-mix(-st-accent-color, st-mix(st-lighten(#000000, 9%), #ffffff, 87%), 5%); }
++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(st-lighten(#252525, 9%), #ffffff, 87%), 5%); }
+ .app-folder-dialog .overview-tile:highlighted, .app-folder-dialog .grid-search-result:highlighted, .app-folder-dialog .overview-tile:selected, .app-folder-dialog .grid-search-result:selected, .app-folder-dialog .overview-tile:checked, .app-folder-dialog .grid-search-result:checked {
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
+ color: #ffffff;
+ background-color: st-mix(st-lighten(#252525, 8%), #ffffff, 87%); }
+ .app-folder-dialog .overview-tile:highlighted:hover, .app-folder-dialog .grid-search-result:highlighted:hover, .app-folder-dialog .overview-tile:selected:hover, .app-folder-dialog .grid-search-result:selected:hover, .app-folder-dialog .overview-tile:checked:hover, .app-folder-dialog .grid-search-result:checked:hover {
+ background-color: st-lighten(st-lighten(#252525, 8%), 7%); }
+ .app-folder-dialog .overview-tile:highlighted:active, .app-folder-dialog .grid-search-result:highlighted:active, .app-folder-dialog .overview-tile:selected:active, .app-folder-dialog .grid-search-result:selected:active, .app-folder-dialog .overview-tile:checked:active, .app-folder-dialog .grid-search-result:checked:active {
+ background-color: st-lighten(st-lighten(#252525, 8%), 9%); }
+ .app-folder-dialog .overview-tile:insensitive, .app-folder-dialog .grid-search-result:insensitive {
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
+ color: st-transparentize(#ffffff, 0.5);
+ background-color: #252525;
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
+ box-shadow: none;
+ border: none; }
+ .app-folder-dialog .overview-tile:drop, .app-folder-dialog .grid-search-result:drop {
+ background-color: st-transparentize(-st-accent-color, 0.8);
+ box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.2); }
+
+.rename-folder-popup .rename-folder-popup-item {
+ spacing: 6px; }
+ .rename-folder-popup .rename-folder-popup-item:ltr, .rename-folder-popup .rename-folder-popup-item:rtl {
+ padding: 0 12px; }
+
+.page-indicator {
+ padding: 6px 12px 0;
+ transition-duration: 400ms; }
+ .page-indicator .page-indicator-icon {
+ width: 10px;
+ height: 10px;
+ border-radius: 999px;
+ background-color: #ffffff;
+ transition-duration: 400ms; }
+
+.apps-scroll-view {
+ padding: 0; }
+
+.system-action-icon {
+ background-color: rgba(255, 255, 255, 0.1);
+ color: #ffffff;
+ border-radius: 999px;
+ icon-size: 48px;
+ box-shadow: inset 0 0 0 2px rgba(255, 255, 255, 0.4); }
+
+.page-navigation-hint.dnd {
+ background: rgba(255, 255, 255, 0.1); }
+
+.page-navigation-hint.next:ltr, .page-navigation-hint.previous:rtl {
+ background-gradient-start: rgba(255, 255, 255, 0.05);
+ background-gradient-end: transparent;
+ background-gradient-direction: horizontal;
+ border-radius: 24px 0px 0px 24px; }
+
+.page-navigation-hint.previous:ltr, .page-navigation-hint.next:rtl {
+ background-gradient-start: transparent;
+ background-gradient-end: rgba(255, 255, 255, 0.05);
+ background-gradient-direction: horizontal;
+ border-radius: 0px 24px 24px 0px; }
+
+.page-navigation-arrow {
+ margin: 6px;
+ padding: 18px;
+ width: 24px;
+ height: 24px;
+ border-radius: 999px;
+ transition-duration: 100ms;
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
+ color: #ffffff;
+ background-color: #000000;
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
+ box-shadow: none;
+ border: none; }
+ .page-navigation-arrow > StIcon {
+ color: #ffffff; }
+ .page-navigation-arrow:hover {
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
+ color: #ffffff;
+ background-color: st-mix(st-lighten(#000000, 7%), #ffffff, 87%); }
+ .page-navigation-arrow:active {
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
+ color: #ffffff;
+ background-color: st-mix(st-lighten(#000000, 9%), #ffffff, 87%); }
+ .page-navigation-arrow:active:hover {
+ background-color: st-lighten(st-lighten(#000000, 9%), 7%); }
+ .page-navigation-arrow:active:focus {
- color: #f6d32d; }
++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(st-lighten(#000000, 9%), #ffffff, 87%), 5%); }
+
+/* Workspace pager */
+.workspace-thumbnails {
+ visible-width: 32px;
+ spacing: 6px;
+ padding: 6px; }
+ .workspace-thumbnails .workspace-thumbnail {
+ color: #ffffff;
+ background-color: #262626;
+ border-radius: 4px;
+ border: 1px solid transparent;
+ border-color: rgba(255, 255, 255, 0.4); }
+ .workspace-thumbnails .placeholder {
+ background-image: url("resource:///org/gnome/shell/theme/workspace-placeholder.svg");
+ background-size: contain;
+ width: 18px; }
+
+.workspace-thumbnail-indicator {
+ border: 3px solid -st-accent-color;
+ border-radius: 8px; }
+
+.ripple-pointer-location {
+ width: 50px;
+ height: 50px;
+ border-radius: 25px;
+ background-color: st-lighten(st-transparentize(-st-accent-color, 0.7), 30%);
+ box-shadow: 0 0 2px 2px st-lighten(-st-accent-color, 20%); }
+
+.pie-timer {
+ width: 60px;
+ height: 60px;
+ -pie-border-width: 3px;
+ -pie-border-color: -st-accent-color;
+ -pie-background-color: st-lighten(st-transparentize(-st-accent-color, 0.7), 40%); }
+
+.magnifier-zoom-region {
+ border: 2px solid -st-accent-color; }
+ .magnifier-zoom-region.full-screen {
+ border-width: 0; }
+
+.select-area-rubberband {
+ background-color: st-transparentize(-st-accent-color, 0.7);
+ border: 1px solid -st-accent-color; }
+
+.user-icon {
+ background-size: contain;
+ border-radius: 999px;
+ icon-size: 64px;
+ background-color: rgba(255, 255, 255, 0.05);
+ color: #ffffff; }
+ .user-icon StIcon {
+ padding: 12px; }
+ .user-icon.user-avatar {
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.1);
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); }
+
+.lightbox {
+ background-color: black; }
+
+.flashspot {
+ background-color: white; }
+
+.hidden {
+ color: transparent; }
+
+.caps-lock-warning-label {
+ text-align: center;
+ padding-bottom: 8px;
- min-height: 1.2em;
- min-width: 1.2em;
- border-width: 1px;
- border-style: solid;
- border-radius: 10px;
++ color: #cd9309; }
+
+/* Workspace animation */
+.workspace-animation {
+ background-color: #0d0d0d; }
+
+/* Tiled window previews */
+.tile-preview {
+ background-color: st-transparentize(-st-accent-color, 0.5);
+ border: 1px solid -st-accent-color; }
+
+/* On-screen Keyboard */
+#keyboard {
+ background-color: #000000;
+ box-shadow: inset 0 1px 0 0 rgba(255, 255, 255, 0.2); }
+ #keyboard .page-indicator {
+ padding: 6px; }
+ #keyboard .page-indicator .page-indicator-icon {
+ width: 8px;
+ height: 8px; }
+
+.key-container {
+ padding: 4px;
+ spacing: 4px; }
+
+.keyboard-key {
+ font-size: 1.455em;
+ font-weight: bold;
- box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.2) !important;
- background-color: st-mix(-st-accent-color, st-mix(st-mix(#ffffff, #1a1a1a, 9%), #ffffff, 87%), 5%); }
++ border-radius: 0.546em;
+ box-shadow: 0 1px 0 0 transparent;
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
+ color: #ffffff;
+ background-color: st-mix(st-mix(#ffffff, #4d4d4d, 9%), #ffffff, 87%); }
+ .keyboard-key:focus {
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
+ color: #ffffff;
- background-color: st-mix(-st-accent-color, st-mix(st-lighten(st-mix(#ffffff, #1a1a1a, 9%), 4%), #ffffff, 87%), 5%); }
++ box-shadow: inset 0 0 0 2px st-transparentize(st-mix(-st-accent-color, #ffffff, 60%), 0.1) !important;
++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(st-mix(#ffffff, #1a1a1a, 9%), #ffffff, 87%), 5%); }
+ .keyboard-key:focus:hover {
- background-color: st-mix(-st-accent-color, st-mix(st-lighten(st-mix(#ffffff, #4d4d4d, 9%), 9%), #ffffff, 87%), 5%); }
++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(st-lighten(st-mix(#ffffff, #1a1a1a, 9%), 4%), #ffffff, 87%), 5%); }
+ .keyboard-key:hover {
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
+ color: #ffffff;
+ background-color: st-mix(st-lighten(st-mix(#ffffff, #4d4d4d, 9%), 4%), #ffffff, 87%); }
+ .keyboard-key:active {
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
+ color: #ffffff;
+ background-color: st-mix(st-lighten(st-mix(#ffffff, #4d4d4d, 9%), 9%), #ffffff, 87%); }
+ .keyboard-key:active:hover {
+ background-color: st-lighten(st-lighten(st-mix(#ffffff, #4d4d4d, 9%), 9%), 4%); }
+ .keyboard-key:active:focus {
- .keyboard-key:grayed {
- background-color: #121212;
- color: #ffffff;
- border-color: rgba(255, 255, 255, 0.2); }
++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(st-lighten(st-mix(#ffffff, #4d4d4d, 9%), 9%), #ffffff, 87%), 5%); }
+ .keyboard-key:checked {
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
+ color: #ffffff;
+ background-color: st-mix(st-lighten(st-mix(#ffffff, #4d4d4d, 9%), 8%), #ffffff, 87%); }
+ .keyboard-key:checked:hover {
+ background-color: st-lighten(st-lighten(st-mix(#ffffff, #4d4d4d, 9%), 8%), 4%); }
+ .keyboard-key:checked:active {
+ background-color: st-lighten(st-lighten(st-mix(#ffffff, #4d4d4d, 9%), 8%), 9%); }
- border-radius: 10px; }
+ .keyboard-key.default-key {
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
+ color: #ffffff;
+ background-color: st-mix(st-mix(#ffffff, #333333, 9%), #ffffff, 87%);
- background-color: st-mix(-st-accent-color, st-mix(st-lighten(st-mix(#ffffff, #333333, 9%), 9%), #ffffff, 87%), 5%); }
++ border: none; }
+ .keyboard-key.default-key:hover {
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
+ color: #ffffff;
+ background-color: st-mix(st-lighten(st-mix(#ffffff, #333333, 9%), 4%), #ffffff, 87%); }
+ .keyboard-key.default-key:active {
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
+ color: #ffffff;
+ background-color: st-mix(st-lighten(st-mix(#ffffff, #333333, 9%), 9%), #ffffff, 87%); }
+ .keyboard-key.default-key:active:hover {
+ background-color: st-lighten(st-lighten(st-mix(#ffffff, #333333, 9%), 9%), 4%); }
+ .keyboard-key.default-key:active:focus {
- border-color: st-lighten(-st-accent-color, 5%);
++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(st-lighten(st-mix(#ffffff, #333333, 9%), 9%), #ffffff, 87%), 5%); }
+ .keyboard-key.default-key:checked {
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
+ color: #ffffff;
+ background-color: st-mix(st-lighten(st-mix(#ffffff, #333333, 9%), 8%), #ffffff, 87%); }
+ .keyboard-key.default-key:checked:hover {
+ background-color: st-lighten(st-lighten(st-mix(#ffffff, #333333, 9%), 8%), 4%); }
+ .keyboard-key.default-key:checked:active {
+ background-color: st-lighten(st-lighten(st-mix(#ffffff, #333333, 9%), 8%), 9%); }
+ .keyboard-key.default-key:latched {
- .keyboard-key.enter-key {
- box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
- color: -st-accent-fg-color;
- background-color: st-mix(st-mix(-st-accent-fg-color, -st-accent-color, 9%), #ffffff, 87%);
- border-radius: 10px;
- color: #ffffff; }
- .keyboard-key.enter-key:hover {
- box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
- color: -st-accent-fg-color;
- background-color: st-mix(st-lighten(st-mix(-st-accent-fg-color, -st-accent-color, 9%), 4%), #ffffff, 87%); }
- .keyboard-key.enter-key:active {
- box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
- color: -st-accent-fg-color;
- background-color: st-mix(st-lighten(st-mix(-st-accent-fg-color, -st-accent-color, 9%), 9%), #ffffff, 87%); }
- .keyboard-key.enter-key:active:hover {
- background-color: st-lighten(st-lighten(st-mix(-st-accent-fg-color, -st-accent-color, 9%), 9%), 4%); }
- .keyboard-key.enter-key:active:focus {
- background-color: st-mix(-st-accent-color, st-mix(st-lighten(st-mix(-st-accent-fg-color, -st-accent-color, 9%), 9%), #ffffff, 87%), 5%); }
- .keyboard-key.enter-key:checked {
- box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
- color: -st-accent-fg-color;
- background-color: st-mix(st-lighten(st-mix(-st-accent-fg-color, -st-accent-color, 9%), 8%), #ffffff, 87%); }
- .keyboard-key.enter-key:checked:hover {
- background-color: st-lighten(st-lighten(st-mix(-st-accent-fg-color, -st-accent-color, 9%), 8%), 4%); }
- .keyboard-key.enter-key:checked:active {
- background-color: st-lighten(st-lighten(st-mix(-st-accent-fg-color, -st-accent-color, 9%), 8%), 9%); }
- .keyboard-key.shift-key-uppercase {
- background-color: gray;
- color: #000000; }
- .keyboard-key.shift-key-uppercase:hover {
- background-color: #8c8c8c;
- color: #0d0d0d; }
+ background-color: -st-accent-color; }
- icon-size: 24px; }
+ .keyboard-key StIcon {
- .keyboard-subkeys {
- -arrow-border-radius: 16px;
++ icon-size: 1.6365em; }
+
- -boxpointer-gap: 6px;
- padding: 6px; }
- .keyboard-subkeys .keyboard-key {
- box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
- color: #ffffff;
- background-color: st-mix(st-mix(#ffffff, #4d4d4d, 9%), #ffffff, 87%);
- border-radius: 10px; }
- .keyboard-subkeys .keyboard-key:focus {
- box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
- color: #ffffff;
- box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.2) !important;
- background-color: st-mix(-st-accent-color, st-mix(st-mix(#ffffff, #1a1a1a, 9%), #ffffff, 87%), 5%); }
- .keyboard-subkeys .keyboard-key:focus:hover {
- background-color: st-mix(-st-accent-color, st-mix(st-lighten(st-mix(#ffffff, #1a1a1a, 9%), 4%), #ffffff, 87%), 5%); }
- .keyboard-subkeys .keyboard-key:hover {
- box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
- color: #ffffff;
- background-color: st-mix(st-lighten(st-mix(#ffffff, #4d4d4d, 9%), 4%), #ffffff, 87%); }
- .keyboard-subkeys .keyboard-key:active {
- box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
- color: #ffffff;
- background-color: st-mix(st-lighten(st-mix(#ffffff, #4d4d4d, 9%), 9%), #ffffff, 87%); }
- .keyboard-subkeys .keyboard-key:active:hover {
- background-color: st-lighten(st-lighten(st-mix(#ffffff, #4d4d4d, 9%), 9%), 4%); }
- .keyboard-subkeys .keyboard-key:active:focus {
- background-color: st-mix(-st-accent-color, st-mix(st-lighten(st-mix(#ffffff, #4d4d4d, 9%), 9%), #ffffff, 87%), 5%); }
- .keyboard-subkeys .keyboard-key:checked {
- box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
- color: #ffffff;
- background-color: st-mix(st-lighten(st-mix(#ffffff, #4d4d4d, 9%), 8%), #ffffff, 87%); }
- .keyboard-subkeys .keyboard-key:checked:hover {
- background-color: st-lighten(st-lighten(st-mix(#ffffff, #4d4d4d, 9%), 8%), 4%); }
- .keyboard-subkeys .keyboard-key:checked:active {
- background-color: st-lighten(st-lighten(st-mix(#ffffff, #4d4d4d, 9%), 8%), 9%); }
++.keyboard-subkeys-boxpointer {
++ -arrow-border-radius: 22px;
+ -arrow-background-color: #000000;
+ -arrow-border-width: 1px;
+ -arrow-border-color: #171717;
+ -arrow-base: 20px;
+ -arrow-rise: 10px;
- padding: 0px 18px;
++ -boxpointer-gap: 4px;
++ border-radius: 22px;
++ box-shadow: 0 0 12px 0 rgba(0, 0, 0, 0.1); }
++ .keyboard-subkeys-boxpointer .key-container {
++ padding: 12px;
++ spacing: 8px; }
+
+.emoji-page .keyboard-key {
+ background-color: transparent;
+ border: none;
+ color: initial; }
+
+.emoji-panel .keyboard-key:latched {
+ border-color: st-lighten(-st-accent-color, 5%);
+ background-color: -st-accent-color; }
+
+.word-suggestions {
+ spacing: 12px;
+ min-height: 17pt;
+ padding: 12px;
+ color: #ffffff; }
+ .word-suggestions StButton {
+ margin: 0 3px;
+ min-width: 32px;
+ border-radius: 4px;
- box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.2) !important;
- background-color: st-mix(-st-accent-color, st-mix(st-mix(#ffffff, #1a1a1a, 9%), #ffffff, 87%), 5%); }
++ padding: 6px 18px;
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
+ background-color: transparent;
+ border-color: transparent;
+ box-shadow: none; }
+ .word-suggestions StButton:insensitive {
+ background-color: transparent !important; }
+ .word-suggestions StButton:focus {
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
+ color: #ffffff;
- background-color: st-mix(-st-accent-color, st-mix(st-lighten(st-mix(#ffffff, #1a1a1a, 9%), 4%), #ffffff, 87%), 5%); }
++ box-shadow: inset 0 0 0 2px st-transparentize(st-mix(-st-accent-color, #ffffff, 60%), 0.1) !important;
++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(st-mix(#ffffff, #1a1a1a, 9%), #ffffff, 87%), 5%); }
+ .word-suggestions StButton:focus:hover {
- background-color: st-mix(-st-accent-color, st-mix(st-lighten(st-mix(#ffffff, #4d4d4d, 9%), 9%), #ffffff, 87%), 5%); }
++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(st-lighten(st-mix(#ffffff, #1a1a1a, 9%), 4%), #ffffff, 87%), 5%); }
+ .word-suggestions StButton:hover {
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
+ color: #ffffff;
+ background-color: st-mix(st-lighten(st-mix(#ffffff, #4d4d4d, 9%), 4%), #ffffff, 87%); }
+ .word-suggestions StButton:active {
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
+ color: #ffffff;
+ background-color: st-mix(st-lighten(st-mix(#ffffff, #4d4d4d, 9%), 9%), #ffffff, 87%); }
+ .word-suggestions StButton:active:hover {
+ background-color: st-lighten(st-lighten(st-mix(#ffffff, #4d4d4d, 9%), 9%), 4%); }
+ .word-suggestions StButton:active:focus {
- background-color: st-mix(-st-accent-color, st-mix(st-lighten(st-mix(#ffffff, #000000, 9%), 9%), #ffffff, 87%), 5%); }
++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(st-lighten(st-mix(#ffffff, #4d4d4d, 9%), 9%), #ffffff, 87%), 5%); }
+ .word-suggestions StButton:checked {
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
+ color: #ffffff;
+ background-color: st-mix(st-lighten(st-mix(#ffffff, #4d4d4d, 9%), 8%), #ffffff, 87%); }
+ .word-suggestions StButton:checked:hover {
+ background-color: st-lighten(st-lighten(st-mix(#ffffff, #4d4d4d, 9%), 8%), 4%); }
+ .word-suggestions StButton:checked:active {
+ background-color: st-lighten(st-lighten(st-mix(#ffffff, #4d4d4d, 9%), 8%), 9%); }
+
+/* Looking Glass */
+.lg-dialog StEntry {
+ min-height: 1.5em; }
+
+.lg-dialog .shell-link {
+ color: st-lighten(-st-accent-color, 20%); }
+ .lg-dialog .shell-link:hover {
+ color: st-lighten(st-lighten(-st-accent-color, 20%), 10%); }
+ .lg-dialog .shell-link:active {
+ color: st-darken(st-lighten(-st-accent-color, 20%), 10%); }
+
+.lg-dialog .actor-link {
+ color: st-darken(#ffffff, 20%); }
+ .lg-dialog .actor-link:hover {
+ color: #ffffff; }
+ .lg-dialog .actor-link:active {
+ color: st-lighten(#ffffff, 20%); }
+ .lg-dialog .actor-link StIcon {
+ icon-size: 12px; }
+
+.lg-completions-text {
+ font-style: italic; }
+
+#LookingGlassDialog {
+ background-color: rgba(0, 0, 0, 0.98);
+ color: #ffffff;
+ border-radius: 16px;
+ margin-top: 4px;
+ border: 2px solid transparent;
+ padding: 6px;
+ spacing: 6px;
+ box-shadow: 0 2px 4px 0 transparent;
+ border-color: rgba(255, 255, 255, 0.4);
+ background-color: #000000;
+ box-shadow: none; }
+ #LookingGlassDialog > #Toolbar {
+ border: none;
+ padding: 6px;
+ border-radius: 0;
+ background-color: transparent;
+ spacing: 6px; }
+ #LookingGlassDialog > #Toolbar .lg-toolbar-button {
+ padding: 6px 12px; }
+ #LookingGlassDialog > #Toolbar .lg-toolbar-button > StIcon {
+ icon-size: 16px; }
+ #LookingGlassDialog .labels {
+ spacing: 6px; }
+ #LookingGlassDialog .notebook-tab {
+ background-color: transparent;
+ -natural-hpadding: 12px;
+ -minimum-hpadding: 12px;
+ padding: 6px 12px; }
+ #LookingGlassDialog .notebook-tab:selected {
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
+ color: #ffffff;
+ background-color: st-mix(st-lighten(st-mix(#ffffff, #000000, 9%), 9%), #ffffff, 87%); }
+ #LookingGlassDialog .notebook-tab:selected:hover {
+ background-color: st-lighten(st-lighten(st-mix(#ffffff, #000000, 9%), 9%), 4%); }
+ #LookingGlassDialog .notebook-tab:selected:focus {
- color: #f6d32d; }
++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(st-lighten(st-mix(#ffffff, #000000, 9%), 9%), #ffffff, 87%), 5%); }
+
+#LookingGlassPropertyInspector {
+ background-color: #000000;
+ color: #ffffff;
+ border-radius: 16px;
+ border: 1px solid rgba(255, 255, 255, 0.2);
+ padding: 12px;
+ border-color: rgba(255, 255, 255, 0.4); }
+ #LookingGlassPropertyInspector .lg-obj-inspector-title {
+ spacing: 4px; }
+ #LookingGlassPropertyInspector .lg-obj-inspector-close-button,
+ #LookingGlassPropertyInspector .lg-obj-inspector-button {
+ padding: 6px 12px; }
+ #LookingGlassPropertyInspector .lg-obj-inspector-close-button {
+ margin: 4px;
+ padding: 6px;
+ border-radius: 999px; }
+ #LookingGlassPropertyInspector .lg-obj-inspector-close-button > StIcon {
+ icon-size: 16px; }
+
+#LookingGlassEvaluator {
+ padding: 6px; }
+ #LookingGlassEvaluator .evaluator-results {
+ spacing: 6px; }
+
+#LookingGlassWindows {
+ padding: 6px;
+ spacing: 6px; }
+ #LookingGlassWindows .lg-window {
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
+ color: #ffffff;
+ background-color: st-mix(st-mix(#ffffff, #000000, 9%), #ffffff, 87%);
+ margin: 0;
+ padding: 12px; }
+
+#LookingGlassExtensions .lg-extensions-list {
+ padding: 6px;
+ spacing: 6px; }
+
+#LookingGlassExtensions .lg-extension {
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
+ color: #ffffff;
+ background-color: st-mix(st-mix(#ffffff, #000000, 9%), #ffffff, 87%);
+ margin: 0;
+ spacing: 4px;
+ padding: 12px; }
+ #LookingGlassExtensions .lg-extension .lg-extension-name {
+ color: #ffffff !important; }
+ #LookingGlassExtensions .lg-extension .lg-extension-meta {
+ spacing: 12px; }
+
+#LookingGlassExtensions .lg-extensions-none {
+ color: rgba(255, 255, 255, 0.5); }
+
+#LookingGlassActors {
+ padding: 6px;
+ spacing: 4px; }
+
+#LookingGlassDebugFlags .lg-debug-flags-header {
+ padding: 6px;
+ padding-top: 12px; }
+
+#LookingGlassDebugFlags .lg-debug-flag-button {
+ padding: 9px 12px;
+ margin-bottom: 6px; }
+ #LookingGlassDebugFlags .lg-debug-flag-button StLabel {
+ font-weight: normal !important; }
+ #LookingGlassDebugFlags .lg-debug-flag-button .toggle-switch {
+ background: rgba(255, 255, 255, 0.3); }
+ #LookingGlassDebugFlags .lg-debug-flag-button .toggle-switch:hover {
+ background: rgba(255, 255, 255, 0.4); }
+ #LookingGlassDebugFlags .lg-debug-flag-button .toggle-switch:checked {
+ background: -st-accent-color;
+ color: -st-accent-fg-color; }
+ #LookingGlassDebugFlags .lg-debug-flag-button .toggle-switch:checked:hover {
+ background-color: st-lighten(-st-accent-color, 5%);
+ color: st-lighten(-st-accent-fg-color, 5%); }
+
+.login-dialog,
+.unlock-dialog {
+ color: #ffffff; }
+ .login-dialog .caps-lock-warning-label,
+ .login-dialog .login-dialog-message-warning,
+ .unlock-dialog .caps-lock-warning-label,
+ .unlock-dialog .login-dialog-message-warning {
+ color: #ffffff; }
+ .login-dialog .login-dialog-prompt-layout,
+ .unlock-dialog .login-dialog-prompt-layout {
+ width: 25em;
+ spacing: 9px; }
+
+.login-dialog-button.cancel-button {
+ padding: 9px; }
+
+.login-dialog-button-box {
+ spacing: 12px; }
+
+.conflicting-session-dialog-content {
+ spacing: 20px; }
+ .conflicting-session-dialog-content .conflicting-session-dialog-title {
+ text-align: center;
+ margin-bottom: 5px; }
+ .conflicting-session-dialog-content .conflicting-session-dialog-desc {
+ text-align: center; }
+ .conflicting-session-dialog-content .conflicting-session-dialog-desc-warning {
+ text-align: center;
- box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.2) !important;
- background-color: st-mix(-st-accent-color, rgba(0, 0, 0, 0.25), 5%); }
++ color: #cd9309; }
+
+.login-dialog-logo-bin {
+ margin: 3em 0; }
+
+.login-dialog-banner-view {
+ max-width: 25em; }
+ .login-dialog-banner-view .login-dialog-banner {
+ color: #e6e6e6; }
+
+.login-dialog-message {
+ text-align: center; }
+
+.login-dialog-message-hint, .login-dialog-message {
+ color: #e6e6e6;
+ min-height: 2.75em; }
+
+.login-dialog-user-selection-box {
+ padding-top: 4em;
+ padding-bottom: 8em; }
+
+.login-dialog-not-listed-label {
+ padding: 6px; }
+
+.login-dialog-not-listed-button {
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
+ color: #ffffff;
+ background-color: #000000;
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
+ box-shadow: none;
+ border: none;
+ padding: 0 6px;
+ margin: 6px; }
+ .login-dialog-not-listed-button:focus {
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
+ color: #ffffff;
- background-color: st-mix(-st-accent-color, st-mix(st-lighten(#000000, 7%), #ffffff, 87%), 5%); }
++ box-shadow: inset 0 0 0 2px st-transparentize(st-mix(-st-accent-color, #ffffff, 60%), 0.1) !important;
++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), rgba(0, 0, 0, 0.25), 5%); }
+ .login-dialog-not-listed-button:focus:hover {
- background-color: st-mix(-st-accent-color, st-mix(st-lighten(#000000, 9%), #ffffff, 87%), 5%); }
++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(st-lighten(#000000, 7%), #ffffff, 87%), 5%); }
+ .login-dialog-not-listed-button:hover {
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
+ color: #ffffff;
+ background-color: st-mix(st-lighten(#000000, 7%), #ffffff, 87%); }
+ .login-dialog-not-listed-button:active {
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
+ color: #ffffff;
+ background-color: st-mix(st-lighten(#000000, 9%), #ffffff, 87%); }
+ .login-dialog-not-listed-button:active:hover {
+ background-color: st-lighten(st-lighten(#000000, 9%), 7%); }
+ .login-dialog-not-listed-button:active:focus {
- box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.2) !important;
- background-color: st-mix(-st-accent-color, st-mix(st-mix(#ffffff, #000000, 9%), #ffffff, 87%), 5%); }
++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(st-lighten(#000000, 9%), #ffffff, 87%), 5%); }
+
+.login-dialog-auth-list-view {
+ -st-vfade-offset: 3em; }
+
+.login-dialog-auth-list {
+ spacing: 6px;
+ margin-left: 2em; }
+
+.login-dialog-auth-list-title {
+ margin-left: 2em; }
+
+.login-dialog-auth-list-item {
+ border-radius: 16px;
+ padding: 4px;
+ color: #b3b3b3; }
+ .login-dialog-auth-list-item:focus, .login-dialog-auth-list-item:selected {
+ background-color: -st-accent-color;
+ color: -st-accent-fg-color; }
+
+.login-dialog-auth-list-label:ltr {
+ padding-left: 15px;
+ text-align: left; }
+
+.login-dialog-auth-list-label:rtl {
+ padding-right: 15px;
+ text-align: right; }
+
+.login-dialog-user-list-view {
+ width: 25em;
+ -st-vfade-offset: 3em; }
+ .login-dialog-user-list-view .login-dialog-user-list {
+ margin: 0 8px;
+ spacing: 12px; }
+ .login-dialog-user-list-view .login-dialog-user-list .login-dialog-user-list-item {
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
+ color: #ffffff;
+ background-color: st-mix(st-mix(#ffffff, #000000, 9%), #ffffff, 87%);
+ border-radius: 16px;
+ padding: 9px; }
+ .login-dialog-user-list-view .login-dialog-user-list .login-dialog-user-list-item:selected, .login-dialog-user-list-view .login-dialog-user-list .login-dialog-user-list-item:focus {
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
+ color: #ffffff;
- background-color: st-mix(-st-accent-color, st-mix(st-lighten(st-mix(#ffffff, #000000, 9%), 4%), #ffffff, 87%), 5%); }
++ box-shadow: inset 0 0 0 2px st-transparentize(st-mix(-st-accent-color, #ffffff, 60%), 0.1) !important;
++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(st-mix(#ffffff, #000000, 9%), #ffffff, 87%), 5%); }
+ .login-dialog-user-list-view .login-dialog-user-list .login-dialog-user-list-item:selected:hover, .login-dialog-user-list-view .login-dialog-user-list .login-dialog-user-list-item:focus:hover {
- background-color: st-mix(-st-accent-color, st-mix(st-lighten(st-mix(#ffffff, #000000, 9%), 9%), #ffffff, 87%), 5%); }
++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(st-lighten(st-mix(#ffffff, #000000, 9%), 4%), #ffffff, 87%), 5%); }
+ .login-dialog-user-list-view .login-dialog-user-list .login-dialog-user-list-item:hover {
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
+ color: #ffffff;
+ background-color: st-mix(st-lighten(st-mix(#ffffff, #000000, 9%), 4%), #ffffff, 87%); }
+ .login-dialog-user-list-view .login-dialog-user-list .login-dialog-user-list-item:active {
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4);
+ color: #ffffff;
+ background-color: st-mix(st-lighten(st-mix(#ffffff, #000000, 9%), 9%), #ffffff, 87%); }
+ .login-dialog-user-list-view .login-dialog-user-list .login-dialog-user-list-item:active:hover {
+ background-color: st-lighten(st-lighten(st-mix(#ffffff, #000000, 9%), 9%), 4%); }
+ .login-dialog-user-list-view .login-dialog-user-list .login-dialog-user-list-item:active:focus {
++ background-color: st-mix(st-mix(-st-accent-color, #ffffff, 60%), st-mix(st-lighten(st-mix(#ffffff, #000000, 9%), 9%), #ffffff, 87%), 5%); }
+ .login-dialog-user-list-view .login-dialog-user-list .login-dialog-user-list-item .user-icon {
+ border: 2px solid transparent; }
+ .login-dialog-user-list-view .login-dialog-user-list .login-dialog-user-list-item .login-dialog-timed-login-indicator {
+ height: 2px;
+ margin-top: 6px;
+ background-color: rgba(255, 255, 255, 0.7); }
+ .login-dialog-user-list-view .login-dialog-user-list .login-dialog-user-list-item:logged-in .user-icon {
+ border-color: -st-accent-color; }
+ .login-dialog-user-list-view .login-dialog-user-list .login-dialog-user-list-item:logged-in .user-icon StIcon {
+ background-color: st-transparentize(-st-accent-color, 0.7); }
+
+.unlock-dialog {
+ background-color: transparent; }
+
+.screen-shield-background {
+ background: black;
+ box-shadow: 0 2px 4px rgba(0, 0, 0, 0.6); }
+
+#lockDialogGroup {
+ background-color: #000000; }
+
+.unlock-dialog-clock {
+ color: #ffffff;
+ spacing: 2em; }
+ .unlock-dialog-clock .unlock-dialog-clock-time {
+ font-size: 6.546em;
+ font-weight: 800; }
+ .unlock-dialog-clock .unlock-dialog-clock-date {
+ font-weight: 400; }
+ .unlock-dialog-clock .unlock-dialog-clock-hint {
+ margin-top: 2em;
+ padding: 6px 18px;
+ border-radius: 16px;
+ font-weight: bold; }
+
+#unlockDialogNotifications StButton#vhandle, #unlockDialogNotifications StButton#hhandle {
+ background-color: rgba(26, 26, 26, 0.3); }
+ #unlockDialogNotifications StButton#vhandle:hover, #unlockDialogNotifications StButton#vhandle:focus, #unlockDialogNotifications StButton#hhandle:hover, #unlockDialogNotifications StButton#hhandle:focus {
+ background-color: rgba(26, 26, 26, 0.5); }
+ #unlockDialogNotifications StButton#vhandle:active, #unlockDialogNotifications StButton#hhandle:active {
+ background-color: st-transparentize(-st-accent-color, 0.5); }
+
+.unlock-dialog-notifications-container {
+ margin: 12px;
+ spacing: 6px;
+ width: 25em;
+ background-color: transparent; }
+ .unlock-dialog-notifications-container .summary-notification-stack-scrollview {
+ padding-top: 0;
+ padding-bottom: 0; }
+ .unlock-dialog-notifications-container .notification,
+ .unlock-dialog-notifications-container .unlock-dialog-notification-source {
+ padding: 12px 16px;
+ border: none;
+ background-color: rgba(255, 255, 255, 0.1);
+ color: #ffffff;
+ border-radius: 16px; }
+ .unlock-dialog-notifications-container .notification.critical,
+ .unlock-dialog-notifications-container .unlock-dialog-notification-source.critical {
+ background-color: rgba(255, 255, 255, 0.2); }
+
+.unlock-dialog-notification-icon {
+ icon-size: 32px; }
+
+.unlock-dialog-notification-label {
+ padding-left: 12px;
+ padding-right: 0; }
+ .unlock-dialog-notification-label:rtl {
+ padding-right: 12px;
+ padding-left: 0; }
+
+.unlock-dialog-notification-count-text {
+ font-weight: bold;
+ padding: 0 12px;
+ color: #ffffff;
+ background-color: rgba(255, 255, 255, 0.1);
+ border-radius: 999px; }
+
+.login-dialog .user-widget .user-widget-label,
+.unlock-dialog .user-widget .user-widget-label {
+ color: #ffffff; }
+
+.login-dialog .user-widget .user-icon,
+.unlock-dialog .user-widget .user-icon {
+ background-color: rgba(255, 255, 255, 0.13);
+ color: #ffffff;
+ background-color: rgba(255, 255, 255, 0.3);
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.4); }
+
+.login-dialog .user-widget.horizontal,
+.unlock-dialog .user-widget.horizontal {
+ spacing: 18px; }
+
+.login-dialog .user-widget.vertical,
+.unlock-dialog .user-widget.vertical {
+ spacing: 24px; }
+ .login-dialog .user-widget.vertical .user-widget-label,
+ .unlock-dialog .user-widget.vertical .user-widget-label {
+ font-weight: 400;
+ font-size: 1.818em;
+ text-align: center;
+ margin-bottom: .75em; }
+ .login-dialog .user-widget.vertical .user-icon,
+ .unlock-dialog .user-widget.vertical .user-icon {
+ icon-size: 160px; }
+ .login-dialog .user-widget.vertical .user-icon StIcon,
+ .unlock-dialog .user-widget.vertical .user-icon StIcon {
+ padding: 30px; }
--- /dev/null
- color: #282828; }
+/* This stylesheet is generated, DO NOT EDIT */
+/* Copyright 2009, 2015 Red Hat, Inc.
+ *
+ * Portions adapted from Mx's data/style/default.css
+ * Copyright 2009 Intel Corporation
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU Lesser General Public License,
+ * version 2.1, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope it will be useful, but WITHOUT ANY
+ * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
+ */
+/* Global Values */
+stage {
+ font-size: 1em;
- color: #282828;
- background-color: st-mix(#282828, whitesmoke, 12%); }
++ color: #222226; }
+
+/* Common Stylings */
+#dash .dash-item-container .show-apps,
+#dash .dash-item-container .overview-tile,
+#dash .dash-item-container .grid-search-result {
+ background: none;
+ box-shadow: none;
+ border: none;
+ border-radius: 0;
+ padding: 0;
+ margin: 0; }
+
+.app-folder-dialog .overview-tile, .app-folder-dialog .grid-search-result, .app-folder, .overview-tile, .grid-search-result, #dash .dash-item-container .show-apps .overview-icon,
+#dash .dash-item-container .overview-tile .overview-icon,
+#dash .dash-item-container .grid-search-result .overview-icon, .list-search-result, .search-provider-icon, .switcher-list .item-box, .audio-device-selection-dialog .audio-selection-box .audio-selection-device {
+ border-radius: 16px;
+ padding: 6px;
+ spacing: 6px;
+ text-align: center;
+ transition-duration: 100ms; }
+
+.login-dialog-user-list-view .login-dialog-user-list .login-dialog-user-list-item, .login-dialog-not-listed-button, .unlock-dialog .button,
+.unlock-dialog .icon-button,
+.unlock-dialog .message .message-header .message-expand-button,
+.message .message-header .unlock-dialog .message-expand-button,
+.unlock-dialog .message .message-header .message-close-button,
+.message .message-header .unlock-dialog .message-close-button,
+.unlock-dialog .screenshot-ui-show-pointer-button, #LookingGlassDialog .notebook-tab, .screenshot-ui-show-pointer-button, .screenshot-ui-type-button, #LookingGlassDebugFlags .lg-debug-flag-button, #LookingGlassPropertyInspector .lg-obj-inspector-close-button,
+#LookingGlassPropertyInspector .lg-obj-inspector-button, #LookingGlassDialog > #Toolbar .lg-toolbar-button, .icon-button, .login-dialog-button.cancel-button, .login-dialog-button.switch-user-button, .login-dialog-button.login-dialog-session-list-button, .message .message-header .message-expand-button,
+.message .message-header .message-close-button, .calendar .calendar-month-header .pager-button, .button {
+ border-radius: 8px;
+ padding: 3px 24px;
+ font-weight: bold;
+ transition: border-width 300ms cubic-bezier(0.25, 0.46, 0.45, 0.94), box-shadow 300ms cubic-bezier(0.25, 0.46, 0.45, 0.94); }
+
+.icon-button, .login-dialog-button.cancel-button, .login-dialog-button.switch-user-button, .login-dialog-button.login-dialog-session-list-button, .screenshot-ui-show-pointer-button, .message .message-header .message-expand-button,
+.message .message-header .message-close-button, .calendar .calendar-month-header .pager-button, .button {
- color: #282828;
- box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.5) !important;
- background-color: st-mix(-st-accent-color, st-mix(#282828, whitesmoke, 12%), 5%); }
++ color: #222226;
++ background-color: st-mix(#222226, #fafafb, 12%); }
+ .icon-button:focus, .login-dialog-button.cancel-button:focus, .login-dialog-button.switch-user-button:focus, .login-dialog-button.login-dialog-session-list-button:focus, .screenshot-ui-show-pointer-button:focus, .message .message-header .message-expand-button:focus,
+ .message .message-header .message-close-button:focus, .calendar .calendar-month-header .pager-button:focus, .button:focus {
- background-color: st-mix(-st-accent-color, st-darken(st-mix(#282828, whitesmoke, 12%), 4%), 5%); }
++ color: #222226;
++ box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.2) !important;
++ background-color: st-mix(-st-accent-color, st-mix(#222226, #fafafb, 12%), 5%); }
+ .icon-button:focus:hover, .login-dialog-button.cancel-button:focus:hover, .login-dialog-button.switch-user-button:focus:hover, .login-dialog-button.login-dialog-session-list-button:focus:hover, .screenshot-ui-show-pointer-button:focus:hover, .message .message-header .message-expand-button:focus:hover,
+ .message .message-header .message-close-button:focus:hover, .calendar .calendar-month-header .pager-button:focus:hover, .button:focus:hover {
- color: #282828;
- background-color: st-darken(st-mix(#282828, whitesmoke, 12%), 4%); }
++ background-color: st-mix(-st-accent-color, st-darken(st-mix(#222226, #fafafb, 12%), 4%), 5%); }
+ .icon-button:hover, .login-dialog-button.cancel-button:hover, .login-dialog-button.switch-user-button:hover, .login-dialog-button.login-dialog-session-list-button:hover, .screenshot-ui-show-pointer-button:hover, .message .message-header .message-expand-button:hover,
+ .message .message-header .message-close-button:hover, .calendar .calendar-month-header .pager-button:hover, .button:hover {
- color: st-transparentize(#282828, 0.6);
- background-color: st-lighten(st-mix(#282828, whitesmoke, 12%), 3%); }
++ color: #222226;
++ background-color: st-darken(st-mix(#222226, #fafafb, 12%), 4%); }
+ .icon-button:insensitive, .login-dialog-button.cancel-button:insensitive, .login-dialog-button.switch-user-button:insensitive, .login-dialog-button.login-dialog-session-list-button:insensitive, .screenshot-ui-show-pointer-button:insensitive, .message .message-header .message-expand-button:insensitive,
+ .message .message-header .message-close-button:insensitive, .calendar .calendar-month-header .pager-button:insensitive, .button:insensitive {
- color: #282828;
- background-color: st-darken(st-mix(#282828, whitesmoke, 12%), 9%); }
++ color: st-transparentize(#222226, 0.6);
++ background-color: st-lighten(st-mix(#222226, #fafafb, 12%), 3%); }
+ .icon-button:selected, .login-dialog-button.cancel-button:selected, .login-dialog-button.switch-user-button:selected, .login-dialog-button.login-dialog-session-list-button:selected, .screenshot-ui-show-pointer-button:selected, .message .message-header .message-expand-button:selected,
+ .message .message-header .message-close-button:selected, .calendar .calendar-month-header .pager-button:selected, .button:selected, .icon-button:active, .login-dialog-button.cancel-button:active, .login-dialog-button.switch-user-button:active, .login-dialog-button.login-dialog-session-list-button:active, .screenshot-ui-show-pointer-button:active, .message .message-header .message-expand-button:active,
+ .message .message-header .message-close-button:active, .calendar .calendar-month-header .pager-button:active, .button:active {
- background-color: st-darken(st-darken(st-mix(#282828, whitesmoke, 12%), 9%), 4%); }
++ color: #222226;
++ background-color: st-darken(st-mix(#222226, #fafafb, 12%), 9%); }
+ .icon-button:selected:hover, .login-dialog-button.cancel-button:selected:hover, .login-dialog-button.switch-user-button:selected:hover, .login-dialog-button.login-dialog-session-list-button:selected:hover, .screenshot-ui-show-pointer-button:selected:hover, .message .message-header .message-expand-button:selected:hover,
+ .message .message-header .message-close-button:selected:hover, .calendar .calendar-month-header .pager-button:selected:hover, .button:selected:hover, .icon-button:active:hover, .login-dialog-button.cancel-button:active:hover, .login-dialog-button.switch-user-button:active:hover, .login-dialog-button.login-dialog-session-list-button:active:hover, .screenshot-ui-show-pointer-button:active:hover, .message .message-header .message-expand-button:active:hover,
+ .message .message-header .message-close-button:active:hover, .calendar .calendar-month-header .pager-button:active:hover, .button:active:hover {
- background-color: st-mix(-st-accent-color, st-darken(st-mix(#282828, whitesmoke, 12%), 9%), 5%); }
++ background-color: st-darken(st-darken(st-mix(#222226, #fafafb, 12%), 9%), 4%); }
+ .icon-button:selected:focus, .login-dialog-button.cancel-button:selected:focus, .login-dialog-button.switch-user-button:selected:focus, .login-dialog-button.login-dialog-session-list-button:selected:focus, .screenshot-ui-show-pointer-button:selected:focus, .message .message-header .message-expand-button:selected:focus,
+ .message .message-header .message-close-button:selected:focus, .calendar .calendar-month-header .pager-button:selected:focus, .button:selected:focus, .icon-button:active:focus, .login-dialog-button.cancel-button:active:focus, .login-dialog-button.switch-user-button:active:focus, .login-dialog-button.login-dialog-session-list-button:active:focus, .screenshot-ui-show-pointer-button:active:focus, .message .message-header .message-expand-button:active:focus,
+ .message .message-header .message-close-button:active:focus, .calendar .calendar-month-header .pager-button:active:focus, .button:active:focus {
- color: #282828;
- background-color: st-darken(st-mix(#282828, whitesmoke, 12%), 8%); }
++ background-color: st-mix(-st-accent-color, st-darken(st-mix(#222226, #fafafb, 12%), 9%), 5%); }
+ .icon-button:checked, .login-dialog-button.cancel-button:checked, .login-dialog-button.switch-user-button:checked, .login-dialog-button.login-dialog-session-list-button:checked, .screenshot-ui-show-pointer-button:checked, .message .message-header .message-expand-button:checked,
+ .message .message-header .message-close-button:checked, .calendar .calendar-month-header .pager-button:checked, .button:checked {
- background-color: st-darken(st-darken(st-mix(#282828, whitesmoke, 12%), 8%), 4%); }
++ color: #222226;
++ background-color: st-darken(st-mix(#222226, #fafafb, 12%), 8%); }
+ .icon-button:checked:hover, .login-dialog-button.cancel-button:checked:hover, .login-dialog-button.switch-user-button:checked:hover, .login-dialog-button.login-dialog-session-list-button:checked:hover, .screenshot-ui-show-pointer-button:checked:hover, .message .message-header .message-expand-button:checked:hover,
+ .message .message-header .message-close-button:checked:hover, .calendar .calendar-month-header .pager-button:checked:hover, .button:checked:hover {
- background-color: st-darken(st-darken(st-mix(#282828, whitesmoke, 12%), 8%), 9%); }
++ background-color: st-darken(st-darken(st-mix(#222226, #fafafb, 12%), 8%), 4%); }
+ .icon-button:checked:active, .login-dialog-button.cancel-button:checked:active, .login-dialog-button.switch-user-button:checked:active, .login-dialog-button.login-dialog-session-list-button:checked:active, .screenshot-ui-show-pointer-button:checked:active, .message .message-header .message-expand-button:checked:active,
+ .message .message-header .message-close-button:checked:active, .calendar .calendar-month-header .pager-button:checked:active, .button:checked:active {
- color: #282828;
- background-color: whitesmoke; }
++ background-color: st-darken(st-darken(st-mix(#222226, #fafafb, 12%), 8%), 9%); }
+
+.calendar .calendar-day-heading, .calendar .calendar-day, .calendar .calendar-month-header .calendar-month-label, .icon-button.flat, .flat.login-dialog-button.cancel-button, .flat.login-dialog-button.switch-user-button, .flat.login-dialog-button.login-dialog-session-list-button, .flat.screenshot-ui-show-pointer-button, .message .message-header .flat.message-expand-button,
+.message .message-header .flat.message-close-button, .calendar .calendar-month-header .pager-button, .button.flat {
- color: #282828;
- box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.5) !important;
- background-color: st-mix(-st-accent-color, rgba(245, 245, 245, 0.25), 5%); }
++ color: #222226;
++ background-color: #fafafb; }
+ .calendar .calendar-day-heading:focus, .calendar .calendar-day:focus, .calendar .calendar-month-header .calendar-month-label:focus, .icon-button.flat:focus, .flat.login-dialog-button.cancel-button:focus, .flat.login-dialog-button.switch-user-button:focus, .flat.login-dialog-button.login-dialog-session-list-button:focus, .flat.screenshot-ui-show-pointer-button:focus, .message .message-header .flat.message-expand-button:focus,
+ .message .message-header .flat.message-close-button:focus, .calendar .calendar-month-header .pager-button:focus, .button.flat:focus {
- background-color: st-mix(-st-accent-color, st-darken(whitesmoke, 7%), 5%); }
++ color: #222226;
++ box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.2) !important;
++ background-color: st-mix(-st-accent-color, rgba(250, 250, 251, 0.25), 5%); }
+ .calendar .calendar-day-heading:focus:hover, .calendar .calendar-day:focus:hover, .calendar .calendar-month-header .calendar-month-label:focus:hover, .icon-button.flat:focus:hover, .flat.login-dialog-button.cancel-button:focus:hover, .flat.login-dialog-button.switch-user-button:focus:hover, .flat.login-dialog-button.login-dialog-session-list-button:focus:hover, .flat.screenshot-ui-show-pointer-button:focus:hover, .message .message-header .flat.message-expand-button:focus:hover,
+ .message .message-header .flat.message-close-button:focus:hover, .calendar .calendar-month-header .pager-button:focus:hover, .button.flat:focus:hover {
- color: #282828;
- background-color: st-darken(whitesmoke, 7%); }
++ background-color: st-mix(-st-accent-color, st-darken(#fafafb, 7%), 5%); }
+ .calendar .calendar-day-heading:hover, .calendar .calendar-day:hover, .calendar .calendar-month-header .calendar-month-label:hover, .icon-button.flat:hover, .flat.login-dialog-button.cancel-button:hover, .flat.login-dialog-button.switch-user-button:hover, .flat.login-dialog-button.login-dialog-session-list-button:hover, .flat.screenshot-ui-show-pointer-button:hover, .message .message-header .flat.message-expand-button:hover,
+ .message .message-header .flat.message-close-button:hover, .calendar .calendar-month-header .pager-button:hover, .button.flat:hover {
- color: st-transparentize(#282828, 0.6);
- background-color: whitesmoke; }
++ color: #222226;
++ background-color: st-darken(#fafafb, 7%); }
+ .calendar .calendar-day-heading:insensitive, .calendar .calendar-day:insensitive, .calendar .calendar-month-header .calendar-month-label:insensitive, .icon-button.flat:insensitive, .flat.login-dialog-button.cancel-button:insensitive, .flat.login-dialog-button.switch-user-button:insensitive, .flat.login-dialog-button.login-dialog-session-list-button:insensitive, .flat.screenshot-ui-show-pointer-button:insensitive, .message .message-header .flat.message-expand-button:insensitive,
+ .message .message-header .flat.message-close-button:insensitive, .calendar .calendar-month-header .pager-button:insensitive, .button.flat:insensitive {
- color: #282828;
- background-color: st-darken(whitesmoke, 9%); }
++ color: st-transparentize(#222226, 0.6);
++ background-color: #fafafb; }
+ .calendar .calendar-day-heading:selected, .calendar .calendar-day:selected, .calendar .calendar-month-header .calendar-month-label:selected, .icon-button.flat:selected, .flat.login-dialog-button.cancel-button:selected, .flat.login-dialog-button.switch-user-button:selected, .flat.login-dialog-button.login-dialog-session-list-button:selected, .flat.screenshot-ui-show-pointer-button:selected, .message .message-header .flat.message-expand-button:selected,
+ .message .message-header .flat.message-close-button:selected, .calendar .calendar-month-header .pager-button:selected, .button.flat:selected, .calendar .calendar-day-heading:active, .calendar .calendar-day:active, .calendar .calendar-month-header .calendar-month-label:active, .icon-button.flat:active, .flat.login-dialog-button.cancel-button:active, .flat.login-dialog-button.switch-user-button:active, .flat.login-dialog-button.login-dialog-session-list-button:active, .flat.screenshot-ui-show-pointer-button:active, .message .message-header .flat.message-expand-button:active,
+ .message .message-header .flat.message-close-button:active, .calendar .calendar-month-header .pager-button:active, .button.flat:active {
- background-color: st-darken(st-darken(whitesmoke, 9%), 7%); }
++ color: #222226;
++ background-color: st-darken(#fafafb, 9%); }
+ .calendar .calendar-day-heading:selected:hover, .calendar .calendar-day:selected:hover, .calendar .calendar-month-header .calendar-month-label:selected:hover, .icon-button.flat:selected:hover, .flat.login-dialog-button.cancel-button:selected:hover, .flat.login-dialog-button.switch-user-button:selected:hover, .flat.login-dialog-button.login-dialog-session-list-button:selected:hover, .flat.screenshot-ui-show-pointer-button:selected:hover, .message .message-header .flat.message-expand-button:selected:hover,
+ .message .message-header .flat.message-close-button:selected:hover, .calendar .calendar-month-header .pager-button:selected:hover, .button.flat:selected:hover, .calendar .calendar-day-heading:active:hover, .calendar .calendar-day:active:hover, .calendar .calendar-month-header .calendar-month-label:active:hover, .icon-button.flat:active:hover, .flat.login-dialog-button.cancel-button:active:hover, .flat.login-dialog-button.switch-user-button:active:hover, .flat.login-dialog-button.login-dialog-session-list-button:active:hover, .flat.screenshot-ui-show-pointer-button:active:hover, .message .message-header .flat.message-expand-button:active:hover,
+ .message .message-header .flat.message-close-button:active:hover, .calendar .calendar-month-header .pager-button:active:hover, .button.flat:active:hover {
- background-color: st-mix(-st-accent-color, st-darken(whitesmoke, 9%), 5%); }
++ background-color: st-darken(st-darken(#fafafb, 9%), 7%); }
+ .calendar .calendar-day-heading:selected:focus, .calendar .calendar-day:selected:focus, .calendar .calendar-month-header .calendar-month-label:selected:focus, .icon-button.flat:selected:focus, .flat.login-dialog-button.cancel-button:selected:focus, .flat.login-dialog-button.switch-user-button:selected:focus, .flat.login-dialog-button.login-dialog-session-list-button:selected:focus, .flat.screenshot-ui-show-pointer-button:selected:focus, .message .message-header .flat.message-expand-button:selected:focus,
+ .message .message-header .flat.message-close-button:selected:focus, .calendar .calendar-month-header .pager-button:selected:focus, .button.flat:selected:focus, .calendar .calendar-day-heading:active:focus, .calendar .calendar-day:active:focus, .calendar .calendar-month-header .calendar-month-label:active:focus, .icon-button.flat:active:focus, .flat.login-dialog-button.cancel-button:active:focus, .flat.login-dialog-button.switch-user-button:active:focus, .flat.login-dialog-button.login-dialog-session-list-button:active:focus, .flat.screenshot-ui-show-pointer-button:active:focus, .message .message-header .flat.message-expand-button:active:focus,
+ .message .message-header .flat.message-close-button:active:focus, .calendar .calendar-month-header .pager-button:active:focus, .button.flat:active:focus {
- color: #282828;
- background-color: st-darken(whitesmoke, 8%); }
++ background-color: st-mix(-st-accent-color, st-darken(#fafafb, 9%), 5%); }
+ .calendar .calendar-day-heading:checked, .calendar .calendar-day:checked, .calendar .calendar-month-header .calendar-month-label:checked, .icon-button.flat:checked, .flat.login-dialog-button.cancel-button:checked, .flat.login-dialog-button.switch-user-button:checked, .flat.login-dialog-button.login-dialog-session-list-button:checked, .flat.screenshot-ui-show-pointer-button:checked, .message .message-header .flat.message-expand-button:checked,
+ .message .message-header .flat.message-close-button:checked, .calendar .calendar-month-header .pager-button:checked, .button.flat:checked {
- background-color: st-darken(st-darken(whitesmoke, 8%), 7%); }
++ color: #222226;
++ background-color: st-darken(#fafafb, 8%); }
+ .calendar .calendar-day-heading:checked:hover, .calendar .calendar-day:checked:hover, .calendar .calendar-month-header .calendar-month-label:checked:hover, .icon-button.flat:checked:hover, .flat.login-dialog-button.cancel-button:checked:hover, .flat.login-dialog-button.switch-user-button:checked:hover, .flat.login-dialog-button.login-dialog-session-list-button:checked:hover, .flat.screenshot-ui-show-pointer-button:checked:hover, .message .message-header .flat.message-expand-button:checked:hover,
+ .message .message-header .flat.message-close-button:checked:hover, .calendar .calendar-month-header .pager-button:checked:hover, .button.flat:checked:hover {
- background-color: st-darken(st-darken(whitesmoke, 8%), 9%); }
++ background-color: st-darken(st-darken(#fafafb, 8%), 7%); }
+ .calendar .calendar-day-heading:checked:active, .calendar .calendar-day:checked:active, .calendar .calendar-month-header .calendar-month-label:checked:active, .icon-button.flat:checked:active, .flat.login-dialog-button.cancel-button:checked:active, .flat.login-dialog-button.switch-user-button:checked:active, .flat.login-dialog-button.login-dialog-session-list-button:checked:active, .flat.screenshot-ui-show-pointer-button:checked:active, .message .message-header .flat.message-expand-button:checked:active,
+ .message .message-header .flat.message-close-button:checked:active, .calendar .calendar-month-header .pager-button:checked:active, .button.flat:checked:active {
- .keyboard-brightness-level .button:checked, .quick-menu-toggle .quick-toggle-arrow:checked, .quick-toggle:checked, .calendar .calendar-day.calendar-today, .icon-button.default, .default.login-dialog-button.cancel-button, .default.login-dialog-button.switch-user-button, .default.login-dialog-button.login-dialog-session-list-button, .default.screenshot-ui-show-pointer-button, .message .message-header .default.message-expand-button,
++ background-color: st-darken(st-darken(#fafafb, 8%), 9%); }
+
- .keyboard-brightness-level .button:focus:checked, .quick-menu-toggle .quick-toggle-arrow:focus:checked, .quick-toggle:focus:checked, .calendar .calendar-day.calendar-today:focus, .icon-button.default:focus, .default.login-dialog-button.cancel-button:focus, .default.login-dialog-button.switch-user-button:focus, .default.login-dialog-button.login-dialog-session-list-button:focus, .default.screenshot-ui-show-pointer-button:focus, .message .message-header .default.message-expand-button:focus,
++.keyboard-brightness-level .button:checked, .quick-toggle:checked, .calendar .calendar-day.calendar-today, .icon-button.default, .default.login-dialog-button.cancel-button, .default.login-dialog-button.switch-user-button, .default.login-dialog-button.login-dialog-session-list-button, .default.screenshot-ui-show-pointer-button, .message .message-header .default.message-expand-button,
+.message .message-header .default.message-close-button, .calendar .calendar-month-header .default.pager-button, .button.default {
+ color: -st-accent-fg-color;
+ background-color: -st-accent-color; }
- box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.5) !important;
- box-shadow: inset 0 0 0 2px st-darken(-st-accent-color, 15%) !important;
++ .keyboard-brightness-level .button:focus:checked, .quick-toggle:focus:checked, .calendar .calendar-day.calendar-today:focus, .icon-button.default:focus, .default.login-dialog-button.cancel-button:focus, .default.login-dialog-button.switch-user-button:focus, .default.login-dialog-button.login-dialog-session-list-button:focus, .default.screenshot-ui-show-pointer-button:focus, .message .message-header .default.message-expand-button:focus,
+ .message .message-header .default.message-close-button:focus, .calendar .calendar-month-header .default.pager-button:focus, .button.default:focus {
+ color: -st-accent-fg-color;
- .keyboard-brightness-level .button:focus:hover:checked, .quick-menu-toggle .quick-toggle-arrow:focus:hover:checked, .quick-toggle:focus:hover:checked, .calendar .calendar-day.calendar-today:focus:hover, .icon-button.default:focus:hover, .default.login-dialog-button.cancel-button:focus:hover, .default.login-dialog-button.switch-user-button:focus:hover, .default.login-dialog-button.login-dialog-session-list-button:focus:hover, .default.screenshot-ui-show-pointer-button:focus:hover, .message .message-header .default.message-expand-button:focus:hover,
++ box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.2) !important;
++ box-shadow: inset 0 0 0 2px st-transparentize(st-darken(-st-accent-color, 20%), 0.2) !important;
+ background-color: st-mix(-st-accent-color, -st-accent-color, 5%); }
- .keyboard-brightness-level .button:hover:checked, .quick-menu-toggle .quick-toggle-arrow:hover:checked, .quick-toggle:hover:checked, .calendar .calendar-day.calendar-today:hover, .icon-button.default:hover, .default.login-dialog-button.cancel-button:hover, .default.login-dialog-button.switch-user-button:hover, .default.login-dialog-button.login-dialog-session-list-button:hover, .default.screenshot-ui-show-pointer-button:hover, .message .message-header .default.message-expand-button:hover,
++ .keyboard-brightness-level .button:focus:hover:checked, .quick-toggle:focus:hover:checked, .calendar .calendar-day.calendar-today:focus:hover, .icon-button.default:focus:hover, .default.login-dialog-button.cancel-button:focus:hover, .default.login-dialog-button.switch-user-button:focus:hover, .default.login-dialog-button.login-dialog-session-list-button:focus:hover, .default.screenshot-ui-show-pointer-button:focus:hover, .message .message-header .default.message-expand-button:focus:hover,
+ .message .message-header .default.message-close-button:focus:hover, .calendar .calendar-month-header .default.pager-button:focus:hover, .button.default:focus:hover {
+ background-color: st-mix(-st-accent-color, st-darken(-st-accent-color, 4%), 5%); }
- .keyboard-brightness-level .button:insensitive:checked, .quick-menu-toggle .quick-toggle-arrow:insensitive:checked, .quick-toggle:insensitive:checked, .calendar .calendar-day.calendar-today:insensitive, .icon-button.default:insensitive, .default.login-dialog-button.cancel-button:insensitive, .default.login-dialog-button.switch-user-button:insensitive, .default.login-dialog-button.login-dialog-session-list-button:insensitive, .default.screenshot-ui-show-pointer-button:insensitive, .message .message-header .default.message-expand-button:insensitive,
++ .keyboard-brightness-level .button:hover:checked, .quick-toggle:hover:checked, .calendar .calendar-day.calendar-today:hover, .icon-button.default:hover, .default.login-dialog-button.cancel-button:hover, .default.login-dialog-button.switch-user-button:hover, .default.login-dialog-button.login-dialog-session-list-button:hover, .default.screenshot-ui-show-pointer-button:hover, .message .message-header .default.message-expand-button:hover,
+ .message .message-header .default.message-close-button:hover, .calendar .calendar-month-header .default.pager-button:hover, .button.default:hover {
+ color: -st-accent-fg-color;
+ background-color: st-darken(-st-accent-color, 4%); }
- .keyboard-brightness-level .button:active:checked, .quick-menu-toggle .quick-toggle-arrow:active:checked, .quick-toggle:active:checked, .calendar .calendar-day.calendar-today:active, .icon-button.default:active, .default.login-dialog-button.cancel-button:active, .default.login-dialog-button.switch-user-button:active, .default.login-dialog-button.login-dialog-session-list-button:active, .default.screenshot-ui-show-pointer-button:active, .message .message-header .default.message-expand-button:active,
++ .keyboard-brightness-level .button:insensitive:checked, .quick-toggle:insensitive:checked, .calendar .calendar-day.calendar-today:insensitive, .icon-button.default:insensitive, .default.login-dialog-button.cancel-button:insensitive, .default.login-dialog-button.switch-user-button:insensitive, .default.login-dialog-button.login-dialog-session-list-button:insensitive, .default.screenshot-ui-show-pointer-button:insensitive, .message .message-header .default.message-expand-button:insensitive,
+ .message .message-header .default.message-close-button:insensitive, .calendar .calendar-month-header .default.pager-button:insensitive, .button.default:insensitive {
+ color: st-transparentize(-st-accent-fg-color, 0.6);
+ background-color: st-lighten(-st-accent-color, 3%); }
- .keyboard-brightness-level .button:active:hover:checked, .quick-menu-toggle .quick-toggle-arrow:active:hover:checked, .quick-toggle:active:hover:checked, .calendar .calendar-day.calendar-today:active:hover, .icon-button.default:active:hover, .default.login-dialog-button.cancel-button:active:hover, .default.login-dialog-button.switch-user-button:active:hover, .default.login-dialog-button.login-dialog-session-list-button:active:hover, .default.screenshot-ui-show-pointer-button:active:hover, .message .message-header .default.message-expand-button:active:hover,
++ .keyboard-brightness-level .button:active:checked, .quick-toggle:active:checked, .calendar .calendar-day.calendar-today:active, .icon-button.default:active, .default.login-dialog-button.cancel-button:active, .default.login-dialog-button.switch-user-button:active, .default.login-dialog-button.login-dialog-session-list-button:active, .default.screenshot-ui-show-pointer-button:active, .message .message-header .default.message-expand-button:active,
+ .message .message-header .default.message-close-button:active, .calendar .calendar-month-header .default.pager-button:active, .button.default:active {
+ color: -st-accent-fg-color;
+ background-color: st-darken(-st-accent-color, 9%); }
- .keyboard-brightness-level .button:active:focus:checked, .quick-menu-toggle .quick-toggle-arrow:active:focus:checked, .quick-toggle:active:focus:checked, .calendar .calendar-day.calendar-today:active:focus, .icon-button.default:active:focus, .default.login-dialog-button.cancel-button:active:focus, .default.login-dialog-button.switch-user-button:active:focus, .default.login-dialog-button.login-dialog-session-list-button:active:focus, .default.screenshot-ui-show-pointer-button:active:focus, .message .message-header .default.message-expand-button:active:focus,
++ .keyboard-brightness-level .button:active:hover:checked, .quick-toggle:active:hover:checked, .calendar .calendar-day.calendar-today:active:hover, .icon-button.default:active:hover, .default.login-dialog-button.cancel-button:active:hover, .default.login-dialog-button.switch-user-button:active:hover, .default.login-dialog-button.login-dialog-session-list-button:active:hover, .default.screenshot-ui-show-pointer-button:active:hover, .message .message-header .default.message-expand-button:active:hover,
+ .message .message-header .default.message-close-button:active:hover, .calendar .calendar-month-header .default.pager-button:active:hover, .button.default:active:hover {
+ background-color: st-darken(st-darken(-st-accent-color, 9%), 4%); }
- color: #282828;
++ .keyboard-brightness-level .button:active:focus:checked, .quick-toggle:active:focus:checked, .calendar .calendar-day.calendar-today:active:focus, .icon-button.default:active:focus, .default.login-dialog-button.cancel-button:active:focus, .default.login-dialog-button.switch-user-button:active:focus, .default.login-dialog-button.login-dialog-session-list-button:active:focus, .default.screenshot-ui-show-pointer-button:active:focus, .message .message-header .default.message-expand-button:active:focus,
+ .message .message-header .default.message-close-button:active:focus, .calendar .calendar-month-header .default.pager-button:active:focus, .button.default:active:focus {
+ background-color: st-mix(-st-accent-color, st-darken(-st-accent-color, 9%), 5%); }
+
+.popup-sub-menu .popup-menu-item, .popup-menu-item {
+ font-weight: normal;
+ spacing: 6px;
+ transition-duration: 100ms;
+ padding: 9px 12px; }
+
+#LookingGlassExtensions .lg-extension, #LookingGlassWindows .lg-window, .calendar, .datemenu-today-button, .quick-toggle-menu, .message, .events-button,
+.world-clocks-button,
+.weather-button {
+ border-radius: 12px;
+ padding: 0.818em;
+ margin: 4px;
+ background-color: #ffffff;
+ box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.03);
+ border: 1px solid rgba(0, 0, 0, 0.09); }
+
+.quick-toggle-menu, .message, .events-button,
+.world-clocks-button,
+.weather-button {
- color: #282828;
++ color: #222226;
+ background-color: #ffffff; }
+ .quick-toggle-menu:hover, .message:hover, .events-button:hover,
+ .world-clocks-button:hover,
+ .weather-button:hover {
- color: #282828;
++ color: #222226;
+ background-color: st-darken(#ffffff, 4%); }
+ .quick-toggle-menu:active, .message:active, .events-button:active,
+ .world-clocks-button:active,
+ .weather-button:active {
- color: #282828;
- box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.5) !important;
++ color: #222226;
+ background-color: st-darken(#ffffff, 9%); }
+ .quick-toggle-menu:active:hover, .message:active:hover, .events-button:active:hover,
+ .world-clocks-button:active:hover,
+ .weather-button:active:hover {
+ background-color: st-darken(st-darken(#ffffff, 9%), 4%); }
+ .quick-toggle-menu:active:focus, .message:active:focus, .events-button:active:focus,
+ .world-clocks-button:active:focus,
+ .weather-button:active:focus {
+ background-color: st-mix(-st-accent-color, st-darken(#ffffff, 9%), 5%); }
+ .quick-toggle-menu:focus, .message:focus, .events-button:focus,
+ .world-clocks-button:focus,
+ .weather-button:focus {
- color: st-transparentize(#282828, 0.6);
++ color: #222226;
++ box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.2) !important;
+ background-color: st-mix(-st-accent-color, #ffffff, 5%); }
+ .quick-toggle-menu:focus:hover, .message:focus:hover, .events-button:focus:hover,
+ .world-clocks-button:focus:hover,
+ .weather-button:focus:hover {
+ background-color: st-mix(-st-accent-color, st-darken(#ffffff, 4%), 5%); }
+ .quick-toggle-menu:insensitive, .message:insensitive, .events-button:insensitive,
+ .world-clocks-button:insensitive,
+ .weather-button:insensitive {
- color: #282828;
- background-color: st-darken(whitesmoke, 7%); }
++ color: st-transparentize(#222226, 0.6);
+ background-color: st-lighten(#ffffff, 3%); }
+
+.calendar, .datemenu-today-button {
+ border: 1px solid transparent !important;
+ background-color: transparent;
+ border-color: transparent;
+ box-shadow: none; }
+ .calendar:insensitive, .datemenu-today-button:insensitive {
+ background-color: transparent !important; }
+ .calendar:hover, .datemenu-today-button:hover {
- color: #282828;
- background-color: st-darken(whitesmoke, 9%); }
++ color: #222226;
++ background-color: st-darken(#fafafb, 7%); }
+ .calendar:active, .datemenu-today-button:active {
- background-color: st-darken(st-darken(whitesmoke, 9%), 7%); }
++ color: #222226;
++ background-color: st-darken(#fafafb, 9%); }
+ .calendar:active:hover, .datemenu-today-button:active:hover {
- background-color: st-mix(-st-accent-color, st-darken(whitesmoke, 9%), 5%); }
++ background-color: st-darken(st-darken(#fafafb, 9%), 7%); }
+ .calendar:active:focus, .datemenu-today-button:active:focus {
- color: #282828;
- box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.5) !important;
++ background-color: st-mix(-st-accent-color, st-darken(#fafafb, 9%), 5%); }
+ .calendar:focus, .datemenu-today-button:focus {
- color: st-transparentize(#282828, 0.6);
++ color: #222226;
++ box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.2) !important;
+ background-color: st-mix(-st-accent-color, #ffffff, 5%); }
+ .calendar:focus:hover, .datemenu-today-button:focus:hover {
+ background-color: st-mix(-st-accent-color, st-darken(#ffffff, 4%), 5%); }
+ .calendar:insensitive, .datemenu-today-button:insensitive {
- selected-color: #282828; }
++ color: st-transparentize(#222226, 0.6);
+ background-color: st-lighten(#ffffff, 3%); }
+
+.unlock-dialog .login-dialog-prompt-entry, .login-dialog .login-dialog-prompt-entry, .app-folder-dialog .folder-name-container .folder-name-entry, .search-entry, .lg-dialog StEntry, StEntry {
+ border-radius: 8px;
+ padding: 9px 9px;
+ selection-background-color: st-transparentize(-st-accent-color, 0.7);
- background-color: gainsboro;
- color: rgba(40, 40, 40, 0.7); }
++ selected-color: #222226; }
+
+StEntry {
- background-color: #d2d2d2;
- color: #282828; }
++ background-color: #e0e0e1;
++ color: rgba(34, 34, 38, 0.7); }
+ StEntry:hover {
- box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.5) !important;
- background-color: st-mix(-st-accent-color, gainsboro, 5%);
- color: #282828; }
++ background-color: #d6d6d7;
++ color: #222226; }
+ StEntry:focus {
- background-color: #e4e4e4;
- color: rgba(40, 40, 40, 0.5); }
++ box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.2) !important;
++ background-color: st-mix(-st-accent-color, #e0e0e1, 5%);
++ color: #222226; }
+ StEntry:insensitive {
- color: rgba(40, 40, 40, 0.7); }
++ background-color: #e8e8e9;
++ color: rgba(34, 34, 38, 0.5); }
+ StEntry StLabel.hint-text {
- color: #282828;
- background-color: rgba(40, 40, 40, 0.15); }
++ color: rgba(34, 34, 38, 0.7); }
+
+.notification-button, .message .message-header .message-expand-button,
+.message .message-header .message-close-button {
+ font-weight: bold;
+ padding: 6px 12px;
+ border-radius: 8px;
- color: #282828;
- box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.5) !important;
- background-color: st-mix(-st-accent-color, rgba(40, 40, 40, 0.15), 5%); }
++ color: #222226;
++ background-color: rgba(34, 34, 38, 0.15); }
+ .notification-button:focus, .message .message-header .message-expand-button:focus,
+ .message .message-header .message-close-button:focus {
- background-color: st-mix(-st-accent-color, rgba(40, 40, 40, 0.3), 5%); }
++ color: #222226;
++ box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.2) !important;
++ background-color: st-mix(-st-accent-color, rgba(34, 34, 38, 0.15), 5%); }
+ .notification-button:focus:hover, .message .message-header .message-expand-button:focus:hover,
+ .message .message-header .message-close-button:focus:hover {
- color: #282828;
- background-color: rgba(40, 40, 40, 0.3); }
++ background-color: st-mix(-st-accent-color, rgba(34, 34, 38, 0.3), 5%); }
+ .notification-button:hover, .message .message-header .message-expand-button:hover,
+ .message .message-header .message-close-button:hover {
- color: #282828;
- background-color: rgba(40, 40, 40, 0.2); }
++ color: #222226;
++ background-color: rgba(34, 34, 38, 0.3); }
+ .notification-button:active, .message .message-header .message-expand-button:active,
+ .message .message-header .message-close-button:active {
- background-color: rgba(40, 40, 40, 0.2); }
++ color: #222226;
++ background-color: rgba(34, 34, 38, 0.2); }
+ .notification-button:active:hover, .message .message-header .message-expand-button:active:hover,
+ .message .message-header .message-close-button:active:hover {
- background-color: st-mix(-st-accent-color, rgba(40, 40, 40, 0.2), 5%); }
++ background-color: rgba(34, 34, 38, 0.2); }
+ .notification-button:active:focus, .message .message-header .message-expand-button:active:focus,
+ .message .message-header .message-close-button:active:focus {
- color: #282828;
- background-color: st-darken(st-mix(#282828, whitesmoke, 12%), 8%); }
++ background-color: st-mix(-st-accent-color, rgba(34, 34, 38, 0.2), 5%); }
+ .notification-button:checked, .message .message-header .message-expand-button:checked,
+ .message .message-header .message-close-button:checked {
- background-color: st-darken(st-darken(st-mix(#282828, whitesmoke, 12%), 8%), 4%); }
++ color: #222226;
++ background-color: st-darken(st-mix(#222226, #fafafb, 12%), 8%); }
+ .notification-button:checked:hover, .message .message-header .message-expand-button:checked:hover,
+ .message .message-header .message-close-button:checked:hover {
- background-color: st-darken(st-darken(st-mix(#282828, whitesmoke, 12%), 8%), 9%); }
++ background-color: st-darken(st-darken(st-mix(#222226, #fafafb, 12%), 8%), 4%); }
+ .notification-button:checked:active, .message .message-header .message-expand-button:checked:active,
+ .message .message-header .message-close-button:checked:active {
- color: st-transparentize(#282828, 0.6);
- background-color: rgba(40, 40, 40, 0.1); }
++ background-color: st-darken(st-darken(st-mix(#222226, #fafafb, 12%), 8%), 9%); }
+ .notification-button:insensitive, .message .message-header .message-expand-button:insensitive,
+ .message .message-header .message-close-button:insensitive {
- color: #282828;
- background-color: rgba(40, 40, 40, 0.1); }
++ color: st-transparentize(#222226, 0.6);
++ background-color: rgba(34, 34, 38, 0.1); }
+
+.modal-dialog .modal-dialog-button-box .modal-dialog-button {
+ font-weight: bold;
+ padding: 12px;
+ border-radius: 12px;
- color: #282828;
- box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.5) !important;
- background-color: st-mix(-st-accent-color, rgba(40, 40, 40, 0.1), 5%); }
++ color: #222226;
++ background-color: rgba(34, 34, 38, 0.1); }
+ .modal-dialog .modal-dialog-button-box .modal-dialog-button:focus {
- background-color: st-mix(-st-accent-color, rgba(40, 40, 40, 0.13), 5%); }
++ color: #222226;
++ box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.2) !important;
++ background-color: st-mix(-st-accent-color, rgba(34, 34, 38, 0.1), 5%); }
+ .modal-dialog .modal-dialog-button-box .modal-dialog-button:focus:hover {
- color: #282828;
- background-color: rgba(40, 40, 40, 0.13); }
++ background-color: st-mix(-st-accent-color, rgba(34, 34, 38, 0.13), 5%); }
+ .modal-dialog .modal-dialog-button-box .modal-dialog-button:hover {
- color: #282828;
- background-color: rgba(40, 40, 40, 0.16); }
++ color: #222226;
++ background-color: rgba(34, 34, 38, 0.13); }
+ .modal-dialog .modal-dialog-button-box .modal-dialog-button:active {
- background-color: rgba(40, 40, 40, 0.19); }
++ color: #222226;
++ background-color: rgba(34, 34, 38, 0.16); }
+ .modal-dialog .modal-dialog-button-box .modal-dialog-button:active:hover {
- background-color: st-mix(-st-accent-color, rgba(40, 40, 40, 0.16), 5%); }
++ background-color: rgba(34, 34, 38, 0.19); }
+ .modal-dialog .modal-dialog-button-box .modal-dialog-button:active:focus {
- color: #282828;
- background-color: st-darken(st-mix(#282828, whitesmoke, 12%), 8%); }
++ background-color: st-mix(-st-accent-color, rgba(34, 34, 38, 0.16), 5%); }
+ .modal-dialog .modal-dialog-button-box .modal-dialog-button:checked {
- background-color: st-darken(st-darken(st-mix(#282828, whitesmoke, 12%), 8%), 4%); }
++ color: #222226;
++ background-color: st-darken(st-mix(#222226, #fafafb, 12%), 8%); }
+ .modal-dialog .modal-dialog-button-box .modal-dialog-button:checked:hover {
- background-color: st-darken(st-darken(st-mix(#282828, whitesmoke, 12%), 8%), 9%); }
++ background-color: st-darken(st-darken(st-mix(#222226, #fafafb, 12%), 8%), 4%); }
+ .modal-dialog .modal-dialog-button-box .modal-dialog-button:checked:active {
- color: st-transparentize(#282828, 0.6);
- background-color: st-lighten(st-mix(#282828, whitesmoke, 12%), 3%); }
++ background-color: st-darken(st-darken(st-mix(#222226, #fafafb, 12%), 8%), 9%); }
+ .modal-dialog .modal-dialog-button-box .modal-dialog-button:insensitive {
- .conflicting-session-dialog-content .conflicting-session-dialog-title, .message-dialog-content .message-dialog-title, .message-list .message-list-placeholder, .datemenu-today-button .date-label {
++ color: st-transparentize(#222226, 0.6);
++ background-color: st-lighten(st-mix(#222226, #fafafb, 12%), 3%); }
+
+.dash-label, .window-caption, .screenshot-ui-tooltip {
+ background-color: rgba(0, 0, 0, 0.9);
+ border: 1px solid rgba(255, 255, 255, 0.1);
+ color: #ffffff;
+ border-radius: 999px;
+ padding: 6px 12px;
+ text-align: center; }
+
+/* General Typography */
+.unlock-dialog-clock .unlock-dialog-clock-date, .app-folder-dialog .folder-name-container .folder-name-label, .app-folder-dialog .folder-name-container .folder-name-entry, .search-statustext {
+ font-weight: 800;
+ font-size: 1.818em; }
+
- .unlock-dialog .user-widget.horizontal .user-widget-label, .quick-toggle-menu .header .title {
++.conflicting-session-dialog-content .conflicting-session-dialog-title, .message-dialog-content .message-dialog-title, .datemenu-today-button .date-label {
+ font-weight: 800;
+ font-size: 1.364em; }
+
+.login-dialog .user-widget.horizontal .user-widget-label,
- .login-dialog-not-listed-label, #LookingGlassExtensions .lg-extension .lg-extension-name, #LookingGlassWindows .lg-window .lg-window-name, #LookingGlassPropertyInspector .lg-obj-inspector-title, .background-app-item .title, .osd-window, .dialog-list .dialog-list-title, .message-list-controls, .weather-button .weather-box .weather-header-box .weather-header, .world-clocks-button .world-clocks-header, .events-button .events-box .events-list .event-box .event-summary, .events-button .events-box .events-title, .calendar .calendar-month-header .calendar-month-label {
++.unlock-dialog .user-widget.horizontal .user-widget-label, .quick-toggle-menu .header .title, .message-list .message-list-placeholder {
+ font-weight: 700;
+ font-size: 1.364em; }
+
+.login-dialog-auth-list-label, #LookingGlassDebugFlags .lg-debug-flags-header, #LookingGlassExtensions .lg-extensions-none, .word-suggestions, .bt-menu-placeholder.popup-menu-item, .restart-message, .polkit-dialog-user-layout .polkit-dialog-user-label,
+.polkit-dialog-user-layout .polkit-dialog-user-root-label, .message-dialog-content .message-dialog-title.lightweight {
+ font-weight: 700;
+ font-size: 1.182em; }
+
- .lg-completions-text, .caps-lock-warning-label, .background-app-item .subtitle, .quick-toggle StBoxLayout > .quick-toggle-subtitle, .screenshot-ui-type-button .icon-label-button-container, .prompt-dialog .prompt-dialog-error-label,
++.login-dialog-not-listed-label, #LookingGlassExtensions .lg-extension .lg-extension-name, #LookingGlassWindows .lg-window .lg-window-name, #LookingGlassPropertyInspector .lg-obj-inspector-title, .background-app-item .title, .quick-toggle .quick-toggle-title, .osd-window, .dialog-list .dialog-list-title, .message-list-controls, .weather-button .weather-box .weather-header-box .weather-header, .world-clocks-button .world-clocks-header, .events-button .events-box .events-list .event-box .event-summary, .events-button .events-box .events-title, .calendar .calendar-month-header .calendar-month-label {
+ font-weight: 700;
+ font-size: 1em; }
+
+.quick-toggle-menu .header .subtitle, .app-menu .popup-inactive-menu-item:first-child > StLabel {
+ font-weight: 700;
+ font-size: 0.818em; }
+
- background-color: #353535;
++.lg-completions-text, .caps-lock-warning-label, .background-app-item .subtitle, .quick-toggle .quick-toggle-subtitle, .screenshot-ui-type-button .icon-label-button-container, .prompt-dialog .prompt-dialog-error-label,
+.prompt-dialog .prompt-dialog-info-label,
+.prompt-dialog .prompt-dialog-null-label, .run-dialog .run-dialog-description, .dialog-list .dialog-list-box .dialog-list-item .dialog-list-item-description, .message .message-header .message-header-content .event-time, .world-clocks-button .world-clocks-grid .world-clocks-timezone, .events-button .events-box .events-list .event-box .event-time {
+ font-weight: 400;
+ font-size: 0.818em; }
+
+.weather-button .weather-box .weather-grid .weather-forecast-time, .calendar .calendar-week-number, .calendar .calendar-day-heading, .calendar .calendar-day {
+ font-weight: 400;
+ font-size: 0.818em; }
+
+#LookingGlassDebugFlags .lg-debug-flag-button StLabel, #LookingGlassEvaluator .evaluator-results, .lg-dialog .actor-link {
+ font-family: monospace; }
+
+.unlock-dialog-clock .unlock-dialog-clock-time, #panel, .weather-button .weather-box .weather-grid .weather-forecast-temp, .world-clocks-button .world-clocks-grid .world-clocks-timezone, .world-clocks-button .world-clocks-grid .world-clocks-time, .events-button .events-box .events-list .event-box .event-time, .calendar .calendar-day-heading, .calendar .calendar-day {
+ font-feature-settings: "tnum"; }
+
+/* OSD Elements */
+#LookingGlassDialog, .screenshot-ui-panel, .workspace-switcher, .switcher-list, .resize-popup, .osd-window {
+ color: #ffffff;
- background-color: #4d4d4d;
++ background-color: #2e2e33;
+ border: 1px solid rgba(255, 255, 255, 0.02);
+ border-radius: 999px;
+ padding: 12px; }
+
+.lg-dialog StEntry {
- background-color: #575757;
++ background-color: #47474c;
+ color: rgba(255, 255, 255, 0.7); }
+ .lg-dialog StEntry:hover {
- box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.5) !important;
- background-color: st-mix(-st-accent-color, #4d4d4d, 5%);
++ background-color: #515157;
+ color: #ffffff; }
+ .lg-dialog StEntry:focus {
- background-color: #454545;
++ box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.2) !important;
++ background-color: st-mix(-st-accent-color, #47474c, 5%);
+ color: #ffffff; }
+ .lg-dialog StEntry:insensitive {
- background-color: st-mix(#ffffff, #353535, 12%); }
++ background-color: #404044;
+ color: rgba(255, 255, 255, 0.5); }
+ .lg-dialog StEntry StLabel.hint-text {
+ color: rgba(255, 255, 255, 0.7); }
+
+#LookingGlassDebugFlags .lg-debug-flag-button, #LookingGlassPropertyInspector .lg-obj-inspector-close-button,
+#LookingGlassPropertyInspector .lg-obj-inspector-button, #LookingGlassDialog > #Toolbar .lg-toolbar-button {
+ color: #ffffff;
- box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.5) !important;
- background-color: st-mix(-st-accent-color, st-mix(#ffffff, #353535, 12%), 5%); }
++ background-color: st-mix(#ffffff, #2e2e33, 12%); }
+ #LookingGlassDebugFlags .lg-debug-flag-button:focus, #LookingGlassPropertyInspector .lg-obj-inspector-close-button:focus,
+ #LookingGlassPropertyInspector .lg-obj-inspector-button:focus, #LookingGlassDialog > #Toolbar .lg-toolbar-button:focus {
+ color: #ffffff;
- background-color: st-mix(-st-accent-color, st-lighten(st-mix(#ffffff, #353535, 12%), 4%), 5%); }
++ box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.2) !important;
++ background-color: st-mix(-st-accent-color, st-mix(#ffffff, #2e2e33, 12%), 5%); }
+ #LookingGlassDebugFlags .lg-debug-flag-button:focus:hover, #LookingGlassPropertyInspector .lg-obj-inspector-close-button:focus:hover,
+ #LookingGlassPropertyInspector .lg-obj-inspector-button:focus:hover, #LookingGlassDialog > #Toolbar .lg-toolbar-button:focus:hover {
- background-color: st-lighten(st-mix(#ffffff, #353535, 12%), 4%); }
++ background-color: st-mix(-st-accent-color, st-lighten(st-mix(#ffffff, #2e2e33, 12%), 4%), 5%); }
+ #LookingGlassDebugFlags .lg-debug-flag-button:hover, #LookingGlassPropertyInspector .lg-obj-inspector-close-button:hover,
+ #LookingGlassPropertyInspector .lg-obj-inspector-button:hover, #LookingGlassDialog > #Toolbar .lg-toolbar-button:hover {
+ color: #ffffff;
- background-color: st-lighten(st-mix(#ffffff, #353535, 12%), 9%); }
++ background-color: st-lighten(st-mix(#ffffff, #2e2e33, 12%), 4%); }
+ #LookingGlassDebugFlags .lg-debug-flag-button:active, #LookingGlassPropertyInspector .lg-obj-inspector-close-button:active,
+ #LookingGlassPropertyInspector .lg-obj-inspector-button:active, #LookingGlassDialog > #Toolbar .lg-toolbar-button:active {
+ color: #ffffff;
- background-color: st-lighten(st-lighten(st-mix(#ffffff, #353535, 12%), 9%), 4%); }
++ background-color: st-lighten(st-mix(#ffffff, #2e2e33, 12%), 9%); }
+ #LookingGlassDebugFlags .lg-debug-flag-button:active:hover, #LookingGlassPropertyInspector .lg-obj-inspector-close-button:active:hover,
+ #LookingGlassPropertyInspector .lg-obj-inspector-button:active:hover, #LookingGlassDialog > #Toolbar .lg-toolbar-button:active:hover {
- background-color: st-mix(-st-accent-color, st-lighten(st-mix(#ffffff, #353535, 12%), 9%), 5%); }
++ background-color: st-lighten(st-lighten(st-mix(#ffffff, #2e2e33, 12%), 9%), 4%); }
+ #LookingGlassDebugFlags .lg-debug-flag-button:active:focus, #LookingGlassPropertyInspector .lg-obj-inspector-close-button:active:focus,
+ #LookingGlassPropertyInspector .lg-obj-inspector-button:active:focus, #LookingGlassDialog > #Toolbar .lg-toolbar-button:active:focus {
- background-color: st-lighten(st-mix(#ffffff, #353535, 12%), 8%); }
++ background-color: st-mix(-st-accent-color, st-lighten(st-mix(#ffffff, #2e2e33, 12%), 9%), 5%); }
+ #LookingGlassDebugFlags .lg-debug-flag-button:checked, #LookingGlassPropertyInspector .lg-obj-inspector-close-button:checked,
+ #LookingGlassPropertyInspector .lg-obj-inspector-button:checked, #LookingGlassDialog > #Toolbar .lg-toolbar-button:checked {
+ color: #ffffff;
- background-color: st-lighten(st-lighten(st-mix(#ffffff, #353535, 12%), 8%), 4%); }
++ background-color: st-lighten(st-mix(#ffffff, #2e2e33, 12%), 8%); }
+ #LookingGlassDebugFlags .lg-debug-flag-button:checked:hover, #LookingGlassPropertyInspector .lg-obj-inspector-close-button:checked:hover,
+ #LookingGlassPropertyInspector .lg-obj-inspector-button:checked:hover, #LookingGlassDialog > #Toolbar .lg-toolbar-button:checked:hover {
- background-color: st-lighten(st-lighten(st-mix(#ffffff, #353535, 12%), 8%), 9%); }
++ background-color: st-lighten(st-lighten(st-mix(#ffffff, #2e2e33, 12%), 8%), 4%); }
+ #LookingGlassDebugFlags .lg-debug-flag-button:checked:active, #LookingGlassPropertyInspector .lg-obj-inspector-close-button:checked:active,
+ #LookingGlassPropertyInspector .lg-obj-inspector-button:checked:active, #LookingGlassDialog > #Toolbar .lg-toolbar-button:checked:active {
- background-color: st-darken(st-mix(#ffffff, #353535, 12%), 3%); }
++ background-color: st-lighten(st-lighten(st-mix(#ffffff, #2e2e33, 12%), 8%), 9%); }
+ #LookingGlassDebugFlags .lg-debug-flag-button:insensitive, #LookingGlassPropertyInspector .lg-obj-inspector-close-button:insensitive,
+ #LookingGlassPropertyInspector .lg-obj-inspector-button:insensitive, #LookingGlassDialog > #Toolbar .lg-toolbar-button:insensitive {
+ color: st-transparentize(#ffffff, 0.6);
- background-color: #353535; }
++ background-color: st-darken(st-mix(#ffffff, #2e2e33, 12%), 3%); }
+
+#LookingGlassDialog .notebook-tab, .screenshot-ui-show-pointer-button, .screenshot-ui-type-button {
+ color: #ffffff;
- box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.5) !important;
- background-color: st-mix(-st-accent-color, rgba(53, 53, 53, 0.25), 5%); }
++ background-color: #2e2e33; }
+ #LookingGlassDialog .notebook-tab:focus, .screenshot-ui-show-pointer-button:focus, .screenshot-ui-type-button:focus {
+ color: #ffffff;
- background-color: st-mix(-st-accent-color, st-lighten(#353535, 7%), 5%); }
++ box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.2) !important;
++ background-color: st-mix(-st-accent-color, rgba(46, 46, 51, 0.25), 5%); }
+ #LookingGlassDialog .notebook-tab:focus:hover, .screenshot-ui-show-pointer-button:focus:hover, .screenshot-ui-type-button:focus:hover {
- background-color: st-lighten(#353535, 7%); }
++ background-color: st-mix(-st-accent-color, st-lighten(#2e2e33, 7%), 5%); }
+ #LookingGlassDialog .notebook-tab:hover, .screenshot-ui-show-pointer-button:hover, .screenshot-ui-type-button:hover {
+ color: #ffffff;
- background-color: st-lighten(#353535, 9%); }
++ background-color: st-lighten(#2e2e33, 7%); }
+ #LookingGlassDialog .notebook-tab:active, .screenshot-ui-show-pointer-button:active, .screenshot-ui-type-button:active {
+ color: #ffffff;
- background-color: st-lighten(st-lighten(#353535, 9%), 7%); }
++ background-color: st-lighten(#2e2e33, 9%); }
+ #LookingGlassDialog .notebook-tab:active:hover, .screenshot-ui-show-pointer-button:active:hover, .screenshot-ui-type-button:active:hover {
- background-color: st-mix(-st-accent-color, st-lighten(#353535, 9%), 5%); }
++ background-color: st-lighten(st-lighten(#2e2e33, 9%), 7%); }
+ #LookingGlassDialog .notebook-tab:active:focus, .screenshot-ui-show-pointer-button:active:focus, .screenshot-ui-type-button:active:focus {
- background-color: st-lighten(#353535, 8%); }
++ background-color: st-mix(-st-accent-color, st-lighten(#2e2e33, 9%), 5%); }
+ #LookingGlassDialog .notebook-tab:checked, .screenshot-ui-show-pointer-button:checked, .screenshot-ui-type-button:checked {
+ color: #ffffff;
- background-color: st-lighten(st-lighten(#353535, 8%), 7%); }
++ background-color: st-lighten(#2e2e33, 8%); }
+ #LookingGlassDialog .notebook-tab:checked:hover, .screenshot-ui-show-pointer-button:checked:hover, .screenshot-ui-type-button:checked:hover {
- background-color: st-lighten(st-lighten(#353535, 8%), 9%); }
++ background-color: st-lighten(st-lighten(#2e2e33, 8%), 7%); }
+ #LookingGlassDialog .notebook-tab:checked:active, .screenshot-ui-show-pointer-button:checked:active, .screenshot-ui-type-button:checked:active {
- background-color: #353535; }
++ background-color: st-lighten(st-lighten(#2e2e33, 8%), 9%); }
+ #LookingGlassDialog .notebook-tab:insensitive, .screenshot-ui-show-pointer-button:insensitive, .screenshot-ui-type-button:insensitive {
+ color: st-transparentize(#ffffff, 0.6);
- background-color: #4c4c4c;
- color: rgba(245, 245, 245, 0.7); }
++ background-color: #2e2e33; }
+
+/* System Elements */
+.login-dialog .login-dialog-prompt-entry, .app-folder-dialog .folder-name-container .folder-name-entry, .search-entry {
- background-color: #565656;
- color: whitesmoke; }
++ background-color: #47474b;
++ color: rgba(250, 250, 251, 0.7); }
+ .login-dialog .login-dialog-prompt-entry:hover, .app-folder-dialog .folder-name-container .folder-name-entry:hover, .search-entry:hover {
- box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.5) !important;
- background-color: st-mix(-st-accent-color, #4c4c4c, 5%);
- color: whitesmoke; }
++ background-color: #515155;
++ color: #fafafb; }
+ .login-dialog .login-dialog-prompt-entry:focus, .app-folder-dialog .folder-name-container .folder-name-entry:focus, .search-entry:focus {
- background-color: #444444;
- color: rgba(245, 245, 245, 0.5); }
++ box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.2) !important;
++ background-color: st-mix(-st-accent-color, #47474b, 5%);
++ color: #fafafb; }
+ .login-dialog .login-dialog-prompt-entry:insensitive, .app-folder-dialog .folder-name-container .folder-name-entry:insensitive, .search-entry:insensitive {
- color: rgba(245, 245, 245, 0.7); }
++ background-color: #404043;
++ color: rgba(250, 250, 251, 0.5); }
+ .login-dialog .login-dialog-prompt-entry StLabel.hint-text, .app-folder-dialog .folder-name-container .folder-name-entry StLabel.hint-text, .search-entry StLabel.hint-text {
- color: whitesmoke;
- background-color: st-mix(whitesmoke, #353535, 12%); }
++ color: rgba(250, 250, 251, 0.7); }
+
+.login-dialog-button.cancel-button, .login-dialog-button.switch-user-button, .login-dialog-button.login-dialog-session-list-button {
- color: st-transparentize(whitesmoke, 0.6);
- background-color: st-lighten(st-mix(whitesmoke, #353535, 12%), 3%); }
++ color: #fafafb;
++ background-color: st-mix(#fafafb, #2e2e33, 12%); }
+ .login-dialog-button.cancel-button:insensitive, .login-dialog-button.switch-user-button:insensitive, .login-dialog-button.login-dialog-session-list-button:insensitive {
- color: whitesmoke;
- box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.5) !important;
- background-color: st-mix(-st-accent-color, st-mix(whitesmoke, #353535, 12%), 5%); }
++ color: st-transparentize(#fafafb, 0.6);
++ background-color: st-lighten(st-mix(#fafafb, #2e2e33, 12%), 3%); }
+ .login-dialog-button.cancel-button:focus, .login-dialog-button.switch-user-button:focus, .login-dialog-button.login-dialog-session-list-button:focus {
- background-color: st-mix(-st-accent-color, st-darken(st-mix(whitesmoke, #353535, 12%), 4%), 5%); }
++ color: #fafafb;
++ box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.2) !important;
++ background-color: st-mix(-st-accent-color, st-mix(#fafafb, #2e2e33, 12%), 5%); }
+ .login-dialog-button.cancel-button:focus:hover, .login-dialog-button.switch-user-button:focus:hover, .login-dialog-button.login-dialog-session-list-button:focus:hover {
- color: whitesmoke;
- background-color: st-darken(st-mix(whitesmoke, #353535, 12%), 4%); }
++ background-color: st-mix(-st-accent-color, st-darken(st-mix(#fafafb, #2e2e33, 12%), 4%), 5%); }
+ .login-dialog-button.cancel-button:hover, .login-dialog-button.switch-user-button:hover, .login-dialog-button.login-dialog-session-list-button:hover {
- color: whitesmoke;
- background-color: st-darken(st-mix(whitesmoke, #353535, 12%), 9%); }
++ color: #fafafb;
++ background-color: st-darken(st-mix(#fafafb, #2e2e33, 12%), 4%); }
+ .login-dialog-button.cancel-button:active, .login-dialog-button.switch-user-button:active, .login-dialog-button.login-dialog-session-list-button:active {
- background-color: st-darken(st-darken(st-mix(whitesmoke, #353535, 12%), 9%), 4%); }
++ color: #fafafb;
++ background-color: st-darken(st-mix(#fafafb, #2e2e33, 12%), 9%); }
+ .login-dialog-button.cancel-button:active:hover, .login-dialog-button.switch-user-button:active:hover, .login-dialog-button.login-dialog-session-list-button:active:hover {
- background-color: st-mix(-st-accent-color, st-darken(st-mix(whitesmoke, #353535, 12%), 9%), 5%); }
++ background-color: st-darken(st-darken(st-mix(#fafafb, #2e2e33, 12%), 9%), 4%); }
+ .login-dialog-button.cancel-button:active:focus, .login-dialog-button.switch-user-button:active:focus, .login-dialog-button.login-dialog-session-list-button:active:focus {
- color: whitesmoke;
- background-color: st-darken(st-mix(whitesmoke, #353535, 12%), 8%); }
++ background-color: st-mix(-st-accent-color, st-darken(st-mix(#fafafb, #2e2e33, 12%), 9%), 5%); }
+ .login-dialog-button.cancel-button:checked, .login-dialog-button.switch-user-button:checked, .login-dialog-button.login-dialog-session-list-button:checked {
- background-color: st-darken(st-darken(st-mix(whitesmoke, #353535, 12%), 8%), 4%); }
++ color: #fafafb;
++ background-color: st-darken(st-mix(#fafafb, #2e2e33, 12%), 8%); }
+ .login-dialog-button.cancel-button:checked:hover, .login-dialog-button.switch-user-button:checked:hover, .login-dialog-button.login-dialog-session-list-button:checked:hover {
- background-color: st-darken(st-darken(st-mix(whitesmoke, #353535, 12%), 8%), 9%); }
++ background-color: st-darken(st-darken(st-mix(#fafafb, #2e2e33, 12%), 8%), 4%); }
+ .login-dialog-button.cancel-button:checked:active, .login-dialog-button.switch-user-button:checked:active, .login-dialog-button.login-dialog-session-list-button:checked:active {
- color: whitesmoke;
- background-color: rgba(245, 245, 245, 0.1); }
++ background-color: st-darken(st-darken(st-mix(#fafafb, #2e2e33, 12%), 8%), 9%); }
+
+/* Lockscreen Elements */
+.unlock-dialog .button,
+.unlock-dialog .icon-button,
+.unlock-dialog .calendar .calendar-month-header .pager-button,
+.calendar .calendar-month-header .unlock-dialog .pager-button,
+.unlock-dialog .message .message-header .message-expand-button,
+.message .message-header .unlock-dialog .message-expand-button,
+.unlock-dialog .message .message-header .message-close-button,
+.message .message-header .unlock-dialog .message-close-button,
+.unlock-dialog .screenshot-ui-show-pointer-button,
+.unlock-dialog .login-dialog-button.cancel-button,
+.unlock-dialog .login-dialog-button.switch-user-button,
+.unlock-dialog .login-dialog-button.login-dialog-session-list-button {
- color: whitesmoke;
- box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.5) !important;
- background-color: st-mix(-st-accent-color, rgba(245, 245, 245, 0.1), 5%); }
++ color: #fafafb;
++ background-color: rgba(250, 250, 251, 0.1); }
+ .unlock-dialog .button:focus,
+ .unlock-dialog .icon-button:focus,
+ .unlock-dialog .calendar .calendar-month-header .pager-button:focus,
+ .calendar .calendar-month-header .unlock-dialog .pager-button:focus,
+ .unlock-dialog .message .message-header .message-expand-button:focus,
+ .message .message-header .unlock-dialog .message-expand-button:focus,
+ .unlock-dialog .message .message-header .message-close-button:focus,
+ .message .message-header .unlock-dialog .message-close-button:focus,
+ .unlock-dialog .screenshot-ui-show-pointer-button:focus,
+ .unlock-dialog .login-dialog-button.cancel-button:focus,
+ .unlock-dialog .login-dialog-button.switch-user-button:focus,
+ .unlock-dialog .login-dialog-button.login-dialog-session-list-button:focus {
- background-color: st-mix(-st-accent-color, rgba(245, 245, 245, 0.13), 5%); }
++ color: #fafafb;
++ box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.2) !important;
++ background-color: st-mix(-st-accent-color, rgba(250, 250, 251, 0.1), 5%); }
+ .unlock-dialog .button:focus:hover,
+ .unlock-dialog .icon-button:focus:hover,
+ .unlock-dialog .calendar .calendar-month-header .pager-button:focus:hover,
+ .calendar .calendar-month-header .unlock-dialog .pager-button:focus:hover,
+ .unlock-dialog .message .message-header .message-expand-button:focus:hover,
+ .message .message-header .unlock-dialog .message-expand-button:focus:hover,
+ .unlock-dialog .message .message-header .message-close-button:focus:hover,
+ .message .message-header .unlock-dialog .message-close-button:focus:hover,
+ .unlock-dialog .screenshot-ui-show-pointer-button:focus:hover,
+ .unlock-dialog .login-dialog-button.cancel-button:focus:hover,
+ .unlock-dialog .login-dialog-button.switch-user-button:focus:hover,
+ .unlock-dialog .login-dialog-button.login-dialog-session-list-button:focus:hover {
- color: whitesmoke;
- background-color: rgba(245, 245, 245, 0.13); }
++ background-color: st-mix(-st-accent-color, rgba(250, 250, 251, 0.13), 5%); }
+ .unlock-dialog .button:hover,
+ .unlock-dialog .icon-button:hover,
+ .unlock-dialog .calendar .calendar-month-header .pager-button:hover,
+ .calendar .calendar-month-header .unlock-dialog .pager-button:hover,
+ .unlock-dialog .message .message-header .message-expand-button:hover,
+ .message .message-header .unlock-dialog .message-expand-button:hover,
+ .unlock-dialog .message .message-header .message-close-button:hover,
+ .message .message-header .unlock-dialog .message-close-button:hover,
+ .unlock-dialog .screenshot-ui-show-pointer-button:hover,
+ .unlock-dialog .login-dialog-button.cancel-button:hover,
+ .unlock-dialog .login-dialog-button.switch-user-button:hover,
+ .unlock-dialog .login-dialog-button.login-dialog-session-list-button:hover {
- color: whitesmoke;
- background-color: rgba(245, 245, 245, 0.16); }
++ color: #fafafb;
++ background-color: rgba(250, 250, 251, 0.13); }
+ .unlock-dialog .button:active,
+ .unlock-dialog .icon-button:active,
+ .unlock-dialog .calendar .calendar-month-header .pager-button:active,
+ .calendar .calendar-month-header .unlock-dialog .pager-button:active,
+ .unlock-dialog .message .message-header .message-expand-button:active,
+ .message .message-header .unlock-dialog .message-expand-button:active,
+ .unlock-dialog .message .message-header .message-close-button:active,
+ .message .message-header .unlock-dialog .message-close-button:active,
+ .unlock-dialog .screenshot-ui-show-pointer-button:active,
+ .unlock-dialog .login-dialog-button.cancel-button:active,
+ .unlock-dialog .login-dialog-button.switch-user-button:active,
+ .unlock-dialog .login-dialog-button.login-dialog-session-list-button:active {
- background-color: rgba(245, 245, 245, 0.19); }
++ color: #fafafb;
++ background-color: rgba(250, 250, 251, 0.16); }
+ .unlock-dialog .button:active:hover,
+ .unlock-dialog .icon-button:active:hover,
+ .unlock-dialog .calendar .calendar-month-header .pager-button:active:hover,
+ .calendar .calendar-month-header .unlock-dialog .pager-button:active:hover,
+ .unlock-dialog .message .message-header .message-expand-button:active:hover,
+ .message .message-header .unlock-dialog .message-expand-button:active:hover,
+ .unlock-dialog .message .message-header .message-close-button:active:hover,
+ .message .message-header .unlock-dialog .message-close-button:active:hover,
+ .unlock-dialog .screenshot-ui-show-pointer-button:active:hover,
+ .unlock-dialog .login-dialog-button.cancel-button:active:hover,
+ .unlock-dialog .login-dialog-button.switch-user-button:active:hover,
+ .unlock-dialog .login-dialog-button.login-dialog-session-list-button:active:hover {
- background-color: st-mix(-st-accent-color, rgba(245, 245, 245, 0.16), 5%); }
++ background-color: rgba(250, 250, 251, 0.19); }
+ .unlock-dialog .button:active:focus,
+ .unlock-dialog .icon-button:active:focus,
+ .unlock-dialog .calendar .calendar-month-header .pager-button:active:focus,
+ .calendar .calendar-month-header .unlock-dialog .pager-button:active:focus,
+ .unlock-dialog .message .message-header .message-expand-button:active:focus,
+ .message .message-header .unlock-dialog .message-expand-button:active:focus,
+ .unlock-dialog .message .message-header .message-close-button:active:focus,
+ .message .message-header .unlock-dialog .message-close-button:active:focus,
+ .unlock-dialog .screenshot-ui-show-pointer-button:active:focus,
+ .unlock-dialog .login-dialog-button.cancel-button:active:focus,
+ .unlock-dialog .login-dialog-button.switch-user-button:active:focus,
+ .unlock-dialog .login-dialog-button.login-dialog-session-list-button:active:focus {
- color: whitesmoke;
- background-color: st-darken(st-mix(whitesmoke, whitesmoke, 12%), 8%); }
++ background-color: st-mix(-st-accent-color, rgba(250, 250, 251, 0.16), 5%); }
+ .unlock-dialog .button:checked,
+ .unlock-dialog .icon-button:checked,
+ .unlock-dialog .calendar .calendar-month-header .pager-button:checked,
+ .calendar .calendar-month-header .unlock-dialog .pager-button:checked,
+ .unlock-dialog .message .message-header .message-expand-button:checked,
+ .message .message-header .unlock-dialog .message-expand-button:checked,
+ .unlock-dialog .message .message-header .message-close-button:checked,
+ .message .message-header .unlock-dialog .message-close-button:checked,
+ .unlock-dialog .screenshot-ui-show-pointer-button:checked,
+ .unlock-dialog .login-dialog-button.cancel-button:checked,
+ .unlock-dialog .login-dialog-button.switch-user-button:checked,
+ .unlock-dialog .login-dialog-button.login-dialog-session-list-button:checked {
- background-color: st-darken(st-darken(st-mix(whitesmoke, whitesmoke, 12%), 8%), 4%); }
++ color: #fafafb;
++ background-color: st-darken(st-mix(#fafafb, #fafafb, 12%), 8%); }
+ .unlock-dialog .button:checked:hover,
+ .unlock-dialog .icon-button:checked:hover,
+ .unlock-dialog .calendar .calendar-month-header .pager-button:checked:hover,
+ .calendar .calendar-month-header .unlock-dialog .pager-button:checked:hover,
+ .unlock-dialog .message .message-header .message-expand-button:checked:hover,
+ .message .message-header .unlock-dialog .message-expand-button:checked:hover,
+ .unlock-dialog .message .message-header .message-close-button:checked:hover,
+ .message .message-header .unlock-dialog .message-close-button:checked:hover,
+ .unlock-dialog .screenshot-ui-show-pointer-button:checked:hover,
+ .unlock-dialog .login-dialog-button.cancel-button:checked:hover,
+ .unlock-dialog .login-dialog-button.switch-user-button:checked:hover,
+ .unlock-dialog .login-dialog-button.login-dialog-session-list-button:checked:hover {
- background-color: st-darken(st-darken(st-mix(whitesmoke, whitesmoke, 12%), 8%), 9%); }
++ background-color: st-darken(st-darken(st-mix(#fafafb, #fafafb, 12%), 8%), 4%); }
+ .unlock-dialog .button:checked:active,
+ .unlock-dialog .icon-button:checked:active,
+ .unlock-dialog .calendar .calendar-month-header .pager-button:checked:active,
+ .calendar .calendar-month-header .unlock-dialog .pager-button:checked:active,
+ .unlock-dialog .message .message-header .message-expand-button:checked:active,
+ .message .message-header .unlock-dialog .message-expand-button:checked:active,
+ .unlock-dialog .message .message-header .message-close-button:checked:active,
+ .message .message-header .unlock-dialog .message-close-button:checked:active,
+ .unlock-dialog .screenshot-ui-show-pointer-button:checked:active,
+ .unlock-dialog .login-dialog-button.cancel-button:checked:active,
+ .unlock-dialog .login-dialog-button.switch-user-button:checked:active,
+ .unlock-dialog .login-dialog-button.login-dialog-session-list-button:checked:active {
- color: st-transparentize(whitesmoke, 0.6);
- background-color: st-lighten(st-mix(whitesmoke, whitesmoke, 12%), 3%); }
++ background-color: st-darken(st-darken(st-mix(#fafafb, #fafafb, 12%), 8%), 9%); }
+ .unlock-dialog .button:insensitive,
+ .unlock-dialog .icon-button:insensitive,
+ .unlock-dialog .calendar .calendar-month-header .pager-button:insensitive,
+ .calendar .calendar-month-header .unlock-dialog .pager-button:insensitive,
+ .unlock-dialog .message .message-header .message-expand-button:insensitive,
+ .message .message-header .unlock-dialog .message-expand-button:insensitive,
+ .unlock-dialog .message .message-header .message-close-button:insensitive,
+ .message .message-header .unlock-dialog .message-close-button:insensitive,
+ .unlock-dialog .screenshot-ui-show-pointer-button:insensitive,
+ .unlock-dialog .login-dialog-button.cancel-button:insensitive,
+ .unlock-dialog .login-dialog-button.switch-user-button:insensitive,
+ .unlock-dialog .login-dialog-button.login-dialog-session-list-button:insensitive {
- background-color: rgba(245, 245, 245, 0.1);
- color: rgba(245, 245, 245, 0.7); }
++ color: st-transparentize(#fafafb, 0.6);
++ background-color: st-lighten(st-mix(#fafafb, #fafafb, 12%), 3%); }
+
+.unlock-dialog .login-dialog-prompt-entry {
- color: whitesmoke; }
++ background-color: rgba(250, 250, 251, 0.1);
++ color: rgba(250, 250, 251, 0.7); }
+ .unlock-dialog .login-dialog-prompt-entry:hover {
+ background-color: rgba(255, 255, 255, 0.1);
- box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.5) !important;
- background-color: st-mix(-st-accent-color, rgba(245, 245, 245, 0.1), 5%);
- color: whitesmoke;
- box-shadow: inset 0 0 0 2px rgba(245, 245, 245, 0.4) !important;
- background-color: st-mix(rgba(245, 245, 245, 0.4), rgba(245, 245, 245, 0.1), 5%); }
++ color: #fafafb; }
+ .unlock-dialog .login-dialog-prompt-entry:focus {
- background-color: rgba(237, 237, 237, 0.1);
- color: rgba(245, 245, 245, 0.5); }
++ box-shadow: inset 0 0 0 2px st-transparentize(rgba(250, 250, 251, 0.4), 0.2) !important;
++ background-color: st-mix(-st-accent-color, rgba(250, 250, 251, 0.1), 5%);
++ color: #fafafb;
++ box-shadow: inset 0 0 0 2px st-transparentize(rgba(250, 250, 251, 0.4), 0.2) !important;
++ background-color: st-mix(rgba(250, 250, 251, 0.4), rgba(250, 250, 251, 0.1), 5%); }
+ .unlock-dialog .login-dialog-prompt-entry:insensitive {
- color: rgba(245, 245, 245, 0.7); }
++ background-color: rgba(242, 242, 244, 0.1);
++ color: rgba(250, 250, 251, 0.5); }
+ .unlock-dialog .login-dialog-prompt-entry StLabel.hint-text {
- warning-color: #f5c211;
++ color: rgba(250, 250, 251, 0.7); }
+
+/* WIDGETS */
+.shell-link {
+ color: st-darken(-st-accent-color, 10%); }
+ .shell-link:hover {
+ color: st-lighten(st-darken(-st-accent-color, 10%), 10%); }
+
+.lowres-icon {
+ icon-shadow: 0 1px 2px rgba(0, 0, 0, 0.2); }
+
+.icon-dropshadow {
+ icon-shadow: 0 2px 4px rgba(0, 0, 0, 0.4); }
+
+/* Entries */
+StEntry StIcon.capslock-warning {
+ icon-size: 1.091em;
- color: #282828;
++ warning-color: #e5a50a;
+ padding: 0 4px; }
+
+StEntry StIcon.peek-password {
+ icon-size: 1.091em;
+ padding: 0 4px; }
+
+StEntry StLabel.hint-text {
+ margin-left: 2px; }
+
+/* Buttons */
+.button {
+ min-height: 1.5em; }
+
+.icon-button, .login-dialog-button.cancel-button, .login-dialog-button.switch-user-button, .login-dialog-button.login-dialog-session-list-button, .screenshot-ui-show-pointer-button, .message .message-header .message-expand-button,
+.message .message-header .message-close-button, .calendar .calendar-month-header .pager-button {
+ border-radius: 999px;
+ padding: 0.818em;
+ min-height: 1.091em; }
+ .icon-button StIcon, .login-dialog-button.cancel-button StIcon, .login-dialog-button.switch-user-button StIcon, .login-dialog-button.login-dialog-session-list-button StIcon, .screenshot-ui-show-pointer-button StIcon, .message .message-header .message-expand-button StIcon,
+ .message .message-header .message-close-button StIcon, .calendar .calendar-month-header .pager-button StIcon {
+ icon-size: 1.091em;
+ -st-icon-style: symbolic; }
+
+/* Check Boxes */
+.check-box StBoxLayout {
+ spacing: .8em; }
+
+.check-box StBin {
+ border-radius: 7px;
+ padding: 2px; }
+
+.check-box:focus StBin {
+ background-color: rgba(0, 0, 0, 0.01);
+ box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.65); }
+
+.check-box StIcon {
+ icon-size: 14px;
+ padding: 1px;
+ color: transparent;
+ border-radius: 6px;
+ border: 2px solid rgba(0, 0, 0, 0.15); }
+
+.check-box:hover StIcon {
+ border-color: rgba(0, 0, 0, 0.2); }
+
+.check-box:active StIcon {
+ border-color: rgba(0, 0, 0, 0.3); }
+
+.check-box:checked StIcon {
+ background-color: -st-accent-color;
+ color: -st-accent-fg-color;
+ border-color: transparent; }
+
+.check-box:checked:hover StIcon {
+ background-color: st-lighten(-st-accent-color, 5%);
+ color: st-lighten(-st-accent-fg-color, 5%); }
+
+.check-box:checked:active StIcon {
+ background-color: st-darken(-st-accent-color, 7%);
+ color: st-darken(-st-accent-fg-color, 7%); }
+
+/* Switches */
+.toggle-switch {
+ width: 46px;
+ border-radius: 999px;
+ transition-duration: 100ms;
- color: #282828;
++ color: #222226;
+ background: rgba(0, 0, 0, 0.15); }
+ .toggle-switch:hover {
+ background: rgba(0, 0, 0, 0.2); }
+ .toggle-switch StIcon {
+ icon-size: 16px; }
+ .toggle-switch .handle {
+ margin: 3px;
+ width: 20px;
+ height: 20px;
+ border-radius: 999px;
+ background: white;
+ box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2);
+ transition-duration: 100ms; }
+ .toggle-switch:checked {
+ background: -st-accent-color;
+ color: -st-accent-fg-color; }
+ .toggle-switch:checked:hover {
+ background-color: st-lighten(-st-accent-color, 5%);
+ color: st-lighten(-st-accent-fg-color, 5%); }
+ .toggle-switch:checked .handle {
+ background: white; }
+
+/* Slider */
+.slider {
- -barlevel-background-color: rgba(40, 40, 40, 0.1);
++ color: #222226;
+ -barlevel-height: 4px;
- color: #3a3a3a; }
++ -barlevel-background-color: rgba(34, 34, 38, 0.1);
+ -barlevel-active-background-color: -st-accent-color;
+ -barlevel-overdrive-color: #e01b24;
+ -barlevel-overdrive-separator-width: 1px;
+ -slider-handle-radius: 0.5455em; }
+ .slider:hover {
- background-color: #b8b8b8;
++ color: #333339; }
+
+/* Scrollbars */
+StScrollView.vfade {
+ -st-vfade-offset: 68px; }
+
+StScrollView.hfade {
+ -st-hfade-offset: 68px; }
+
+StScrollBar {
+ padding: 0; }
+ StScrollView StScrollBar {
+ min-width: 8px;
+ min-height: 8px; }
+ StScrollBar StBin#trough {
+ border-radius: 0;
+ background-color: transparent; }
+ StScrollBar StButton#vhandle, StScrollBar StButton#hhandle {
+ border-radius: 8px;
- background-color: #8f8f8f; }
++ background-color: #b9b9bb;
+ border: 3px solid transparent;
+ transition: 500ms all ease; }
+ StScrollBar StButton#vhandle:hover, StScrollBar StButton#hhandle:hover {
- background-color: #a3a3a3; }
++ background-color: #8e8e91; }
+ StScrollBar StButton#vhandle:active, StScrollBar StButton#hhandle:active {
- color: #282828; }
++ background-color: #a4a4a6; }
+
+/* Popovers/Menus */
+.popup-menu-boxpointer, .candidate-popup-boxpointer {
+ -arrow-rise: 6px; }
+
+.popup-menu {
+ min-width: 15em;
- background-color: whitesmoke;
++ color: #222226; }
+ .popup-menu.panel-menu {
+ margin-bottom: 1.75em; }
+
+.popup-menu-content, .candidate-popup-content {
+ padding: 6px;
- border: 1px solid #e3e3e3;
++ background-color: #fafafb;
+ border-radius: 20px;
- .popup-menu-item:hover {
- color: #282828;
- background-color: st-darken(st-mix(#282828, #e8e8e8, 12%), 4%); }
++ border: 1px solid #e6e6eb;
+ box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.05); }
+
+.popup-menu-item {
+ background-color: transparent;
+ border-color: transparent;
+ box-shadow: none;
+ border-radius: 12px; }
+ .popup-menu-item:insensitive {
+ background-color: transparent !important; }
- color: #282828;
- background-color: st-darken(st-mix(#282828, #e8e8e8, 12%), 9%); }
+ .popup-menu-item:active {
- background-color: st-darken(st-darken(st-mix(#282828, #e8e8e8, 12%), 9%), 4%); }
++ color: #222226;
++ background-color: st-darken(#ececf0, 9%); }
+ .popup-menu-item:active:hover {
- background-color: st-mix(-st-accent-color, st-darken(st-mix(#282828, #e8e8e8, 12%), 9%), 5%); }
- .popup-menu-item:selected, .popup-menu-item:checked {
- color: #282828;
- background-color: st-darken(st-mix(#282828, #e8e8e8, 12%), 8%); }
- .popup-menu-item:selected:hover, .popup-menu-item:checked:hover {
- background-color: st-darken(st-darken(st-mix(#282828, #e8e8e8, 12%), 8%), 4%); }
- .popup-menu-item:selected:active, .popup-menu-item:checked:active {
- background-color: st-darken(st-darken(st-mix(#282828, #e8e8e8, 12%), 8%), 9%); }
++ background-color: st-darken(st-darken(#ececf0, 9%), 7%); }
+ .popup-menu-item:active:focus {
- color: st-transparentize(#282828, 0.6);
- background-color: st-lighten(st-mix(#282828, #e8e8e8, 12%), 3%); }
++ background-color: st-mix(-st-accent-color, st-darken(#ececf0, 9%), 5%); }
++ .popup-menu-item:hover, .popup-menu-item:selected, .popup-menu-item:checked {
++ color: #222226;
++ background-color: st-darken(#ececf0, 7%); }
+ .popup-menu-item:insensitive {
- color: #282828; }
++ color: st-transparentize(#222226, 0.6);
++ background-color: #ececf0; }
+ .popup-menu-item:checked {
+ border-radius: 12px 12px 0 0 !important; }
+ .popup-menu-item .toggle-switch:ltr {
+ margin-left: 4px; }
+ .popup-menu-item .toggle-switch:rtl {
+ margin-right: 4px; }
+
+.popup-ornamented-menu-item:ltr {
+ padding-left: 6px; }
+
+.popup-ornamented-menu-item:rtl {
+ padding-right: 6px; }
+
+.popup-inactive-menu-item {
- color: #7a7a7a; }
++ color: #222226; }
+ .popup-inactive-menu-item:insensitive {
- background-color: #cacaca; }
++ color: #78787b; }
+
+.popup-menu-arrow,
+.popup-menu-icon {
+ icon-size: 1.091em; }
+
+.popup-sub-menu {
+ border-radius: 0 0 13px 13px;
+ margin-bottom: 6px;
+ border: 1px solid transparent;
- .popup-sub-menu .popup-menu-item:hover {
- color: #282828;
- background-color: st-darken(st-mix(#282828, #cacaca, 12%), 4%); }
++ background-color: #cacad4; }
+ .popup-sub-menu .popup-menu-item {
+ border-radius: 0;
+ border-top-width: 0;
+ background-color: transparent;
+ border-color: transparent;
+ box-shadow: none; }
+ .popup-sub-menu .popup-menu-item:insensitive {
+ background-color: transparent !important; }
- color: #282828;
- background-color: st-darken(st-mix(#282828, #cacaca, 12%), 9%); }
+ .popup-sub-menu .popup-menu-item:active {
- background-color: st-darken(st-darken(st-mix(#282828, #cacaca, 12%), 9%), 4%); }
++ color: #222226;
++ background-color: st-darken(#cacad4, 9%); }
+ .popup-sub-menu .popup-menu-item:active:hover {
- background-color: st-mix(-st-accent-color, st-darken(st-mix(#282828, #cacaca, 12%), 9%), 5%); }
- .popup-sub-menu .popup-menu-item:selected, .popup-sub-menu .popup-menu-item:checked {
- color: #282828;
- background-color: st-darken(st-mix(#282828, #cacaca, 12%), 8%); }
- .popup-sub-menu .popup-menu-item:selected:hover, .popup-sub-menu .popup-menu-item:checked:hover {
- background-color: st-darken(st-darken(st-mix(#282828, #cacaca, 12%), 8%), 4%); }
- .popup-sub-menu .popup-menu-item:selected:active, .popup-sub-menu .popup-menu-item:checked:active {
- background-color: st-darken(st-darken(st-mix(#282828, #cacaca, 12%), 8%), 9%); }
++ background-color: st-darken(st-darken(#cacad4, 9%), 7%); }
+ .popup-sub-menu .popup-menu-item:active:focus {
- color: st-transparentize(#282828, 0.6);
- background-color: st-lighten(st-mix(#282828, #cacaca, 12%), 3%); }
++ background-color: st-mix(-st-accent-color, st-darken(#cacad4, 9%), 5%); }
++ .popup-sub-menu .popup-menu-item:hover, .popup-sub-menu .popup-menu-item:selected, .popup-sub-menu .popup-menu-item:checked {
++ color: #222226;
++ background-color: st-darken(#cacad4, 7%); }
+ .popup-sub-menu .popup-menu-item:insensitive {
- background-color: rgba(40, 40, 40, 0.15); }
++ color: st-transparentize(#222226, 0.6);
++ background-color: #cacad4; }
+ .popup-sub-menu .popup-menu-item:last-child {
+ border-radius: 0 0 12px 12px;
+ border-bottom-width: 0; }
+ .popup-sub-menu .popup-menu-section .popup-menu-item:last-child:hover, .popup-sub-menu .popup-menu-section .popup-menu-item:last-child:focus {
+ border-radius: 0; }
+ .popup-sub-menu .popup-menu-section:last-child .popup-menu-item:last-child {
+ border-radius: 0 0 12px 12px; }
+
+.popup-menu-ornament {
+ icon-size: 1.091em !important;
+ width: 1.091em; }
+
+.popup-separator-menu-item {
+ border: none !important; }
+ .popup-separator-menu-item .popup-separator-menu-item-separator {
+ height: 1px;
- background-color: rgba(40, 40, 40, 0.15); }
++ background-color: rgba(34, 34, 38, 0.15); }
+ .popup-sub-menu .popup-separator-menu-item {
+ background-color: transparent; }
+ .popup-sub-menu .popup-separator-menu-item:ltr {
+ margin-right: 2.5em; }
+ .popup-sub-menu .popup-separator-menu-item:rtl {
+ margin-left: 2.5em; }
+ .popup-sub-menu .popup-separator-menu-item .popup-separator-menu-item-separator {
- color: #282828 !important;
++ background-color: rgba(34, 34, 38, 0.15); }
+
+.background-menu {
+ -boxpointer-gap: 0px;
+ -arrow-rise: 0px; }
+
+.app-menu {
+ max-width: 27.25em; }
+ .app-menu .popup-inactive-menu-item:first-child > StLabel:ltr {
+ margin-right: 8px; }
+ .app-menu .popup-inactive-menu-item:first-child > StLabel:rtl {
+ margin-left: 8px; }
+
+/* Date/Time Menu */
+#calendarArea {
+ padding: 4px; }
+
+.datemenu-popover {
+ border-radius: 30px; }
+
+.datemenu-calendar-column {
+ spacing: 6px; }
+ .datemenu-calendar-column:ltr {
+ margin-left: 6px; }
+ .datemenu-calendar-column:rtl {
+ margin-right: 6px; }
+ .datemenu-calendar-column .datemenu-displays-box {
+ spacing: 6px; }
+
+.datemenu-today-button {
+ padding: 9px; }
+ .datemenu-today-button .day-label {
+ font-weight: bold; }
+
+.calendar {
+ margin-top: 0;
+ padding: 0; }
+ .calendar .calendar-month-header .calendar-change-month-back StIcon,
+ .calendar .calendar-month-header .calendar-change-month-forward StIcon {
+ icon-size: 1.091em; }
+ .calendar .calendar-month-header .calendar-month-label {
- color: #7a7a7a; }
++ color: #222226 !important;
+ padding: 8px 0;
+ width: 10em;
+ border-radius: 999px;
+ text-align: center; }
+ .calendar .calendar-month-header .pager-button {
+ height: 2.6em;
+ width: 2.6em;
+ padding: 0; }
+ .calendar .calendar-day {
+ border-radius: 999px;
+ height: 3em;
+ width: 3em;
+ margin: 2px;
+ padding: 0;
+ font-weight: bold;
+ text-align: center; }
+ .calendar .calendar-day.calendar-weekend {
- color: rgba(40, 40, 40, 0.5);
++ color: #78787b; }
+ .calendar .calendar-day.calendar-other-month {
- color: rgba(40, 40, 40, 0.5); }
++ color: rgba(34, 34, 38, 0.5);
+ font-weight: normal; }
+ .calendar .calendar-day.calendar-other-month.calendar-weekend {
- background-color: rgba(122, 122, 122, 0.2);
- color: #7a7a7a; }
++ color: rgba(34, 34, 38, 0.5); }
+ .calendar .calendar-day.calendar-today {
+ color: -st-accent-fg-color !important; }
+ .calendar .calendar-day.calendar-today.calendar-day-with-events {
+ background-image: url("resource:///org/gnome/shell/theme/calendar-today.svg") !important; }
+ .calendar .calendar-day.calendar-day-with-events {
+ background-image: url("resource:///org/gnome/shell/theme/calendar-today-light.svg");
+ background-size: contain; }
+ .calendar .calendar-day-heading {
+ font-weight: bold;
+ text-align: center;
+ margin: 4px;
+ padding: 3px 6px;
+ border-radius: 8px; }
+ .calendar .calendar-week-number {
+ font-weight: bold;
+ font-feature-settings: "tnum";
+ text-align: center;
+ margin: 6px;
+ padding: 0 6px;
+ border-radius: 4px;
- color: #7a7a7a;
++ background-color: rgba(120, 120, 123, 0.2);
++ color: #78787b; }
+
+.events-button .events-box .events-title {
- color: #7a7a7a; }
++ color: #78787b;
+ padding-bottom: 6px; }
+
+.events-button .events-box .events-list {
+ spacing: 6px; }
+ .events-button .events-box .events-list .event-box {
+ spacing: 6px;
+ border-radius: 8px; }
+ .events-button .events-box .events-list .event-box .event-time {
- color: #7a7a7a;
++ color: #78787b; }
+ .events-button .events-box .events-list .event-placeholder {
- color: #7a7a7a; }
++ color: #78787b;
+ font-style: italic; }
+
+.world-clocks-button .world-clocks-header {
- color: #282828; }
++ color: #78787b; }
+ .world-clocks-button .world-clocks-header.no-world-clocks {
- color: #7a7a7a; }
++ color: #222226; }
+
+.world-clocks-button .world-clocks-grid {
+ spacing-rows: 6px;
+ spacing-columns: 12px; }
+ .world-clocks-button .world-clocks-grid .world-clocks-time {
+ font-weight: bold; }
+ .world-clocks-button .world-clocks-grid .world-clocks-time:ltr {
+ text-align: right; }
+ .world-clocks-button .world-clocks-grid .world-clocks-time:rtl {
+ text-align: left; }
+ .world-clocks-button .world-clocks-grid .world-clocks-timezone {
- color: #7a7a7a; }
++ color: #78787b; }
+
+.weather-button .weather-box {
+ spacing: 6px; }
+ .weather-button .weather-box .weather-header-box {
+ spacing: 6px; }
+ .weather-button .weather-box .weather-header-box .weather-header {
- color: #282828; }
++ color: #78787b; }
+ .weather-button .weather-box .weather-header-box .weather-header.no-location {
- border: solid rgba(40, 40, 40, 0.15); }
++ color: #222226; }
+ .weather-button .weather-box .weather-header-box .weather-header.location {
+ font-weight: normal; }
+ .weather-button .weather-box .weather-grid {
+ spacing-rows: 6px;
+ spacing-columns: 12px; }
+ .weather-button .weather-box .weather-grid .weather-forecast-time {
+ padding-top: 6px;
+ padding-bottom: 6px; }
+ .weather-button .weather-box .weather-grid .weather-forecast-icon {
+ icon-size: 2.182em;
+ margin-bottom: 4px; }
+ .weather-button .weather-box .weather-grid .weather-forecast-temp {
+ font-weight: bold; }
+
+/* Message List */
+.message-list {
+ width: 29em;
- color: rgba(40, 40, 40, 0.25); }
++ border: solid rgba(34, 34, 38, 0.15); }
+ .message-list:ltr {
+ margin-left: 0;
+ margin-right: 4px;
+ padding-right: 6px;
+ border-right-width: 1px; }
+ .message-list:rtl {
+ margin-right: 0;
+ margin-left: 4px;
+ padding-left: 6px;
+ border-left-width: 1px; }
+ .message-list .message-list-placeholder {
- color: #7a7a7a;
++ color: rgba(34, 34, 38, 0.45); }
+ .message-list .message-list-placeholder > StIcon {
+ icon-size: 96px;
+ margin-bottom: 12px;
+ -st-icon-style: symbolic; }
+
+.message-list-sections {
+ spacing: 12px; }
+ .message-list-sections:ltr {
+ margin-right: 12px; }
+ .message-list-sections:rtl {
+ margin-left: 12px; }
+
+.message-list-section,
+.message-list-section-list {
+ spacing: 12px; }
+
+.message-list-controls {
+ padding: 12px;
+ padding-bottom: 6px;
+ spacing: 6px; }
+ .message-list-controls .dnd-button {
+ border-width: 2px;
+ border-color: transparent;
+ border-radius: 32px;
+ border-style: solid; }
+ .message-list-controls .dnd-button:focus {
+ border-color: st-transparentize(-st-accent-color, 0.4); }
+
+.message {
+ padding: 6px;
+ margin: 0;
+ border-radius: 16px; }
+ .message .message-header {
+ spacing: 6px;
- color: #7a7a7a;
++ color: #78787b;
+ padding: 0 6px; }
+ .message .message-header:ltr {
+ padding-right: 0; }
+ .message .message-header:rtl {
+ padding-left: 0; }
+ .message .message-header .message-source-icon {
+ icon-size: 1.091em;
+ -st-icon-style: symbolic; }
+ .message .message-header .message-header-content {
+ spacing: 6px;
+ min-height: 1.637em;
+ padding-bottom: 6px; }
+ .message .message-header .message-header-content .message-source-title {
+ font-weight: bold; }
+ .message .message-header .message-header-content .event-time {
- color: #282828; }
++ color: #78787b;
+ padding-bottom: 0.068em; }
+ .message .message-header .message-header-content .event-time:ltr {
+ text-align: right; }
+ .message .message-header .message-header-content .event-time:rtl {
+ text-align: left; }
+ .message .message-header .message-expand-button,
+ .message .message-header .message-close-button {
+ border-radius: 999px;
- background-color: rgba(40, 40, 40, 0.07);
++ color: #222226; }
+ .message .message-header .message-expand-button {
+ padding: 6px; }
+ .message .message-header .message-close-button {
+ margin: 3px;
+ padding: 4px; }
+ .message .message-box {
+ padding: 6px;
+ margin-top: 0;
+ spacing: 6px; }
+ .message .message-box .message-icon {
+ icon-size: 48px; }
+ .message .message-box .message-icon:ltr {
+ margin-right: 6px; }
+ .message .message-box .message-icon:rtl {
+ margin-left: 6px; }
+ .message .message-box .message-icon.message-themed-icon {
+ border-radius: 999px;
- color: #282828;
++ background-color: rgba(34, 34, 38, 0.07);
+ icon-size: 1.091em;
+ min-width: 48px;
+ min-height: 48px; }
+ .message .message-box:first-child {
+ margin-top: 12px; }
+ .message .message-box .message-content {
+ spacing: 4px; }
+ .message .message-box .message-content .message-title {
+ font-weight: bold; }
+ .message .message-action-bin {
+ padding: 4px;
+ spacing: 6px; }
+ .message .message-action-bin * {
+ margin: 0 4px; }
+ .message .message-action-bin *:first-child:ltr {
+ margin-left: 0; }
+ .message .message-action-bin *:first-child:rtl {
+ margin-right: 0; }
+ .message .message-action-bin *:last-child:ltr {
+ margin-right: 0; }
+ .message .message-action-bin *:last-child:rtl {
+ margin-left: 0; }
+
+.url-highlighter {
+ link-color: st-darken(-st-accent-color, 10%); }
+
+/* Media Controls */
+.message-media-control {
+ padding: 0 18px;
+ border-radius: 8px;
- background-color: #ebebeb;
- color: #282828; }
++ color: #222226;
+ border: 1px solid transparent; }
+ .message-media-control:hover {
- background-color: #e6e6e6;
- color: #282828; }
++ background-color: #efeff2;
++ color: #222226; }
+ .message-media-control:active {
- color: #878787; }
++ background-color: #e9e9ed;
++ color: #222226; }
+ .message-media-control:insensitive {
- color: #7a7a7a; }
++ color: #858588; }
+ .message-media-control StIcon {
+ icon-size: 16px; }
+
+.media-message .message-icon {
+ border-radius: 8px !important; }
+ .media-message .message-icon.message-themed-icon {
+ icon-size: 32px !important; }
+
+.candidate-popup-content {
+ padding: 6px;
+ spacing: 6px;
+ border-radius: 12px; }
+
+.candidate-index {
+ padding: 0;
+ padding-right: 6px;
- background-color: #dedede;
- color: #111111; }
++ color: #78787b; }
+
+.candidate-box {
+ padding: 6px 12px 6px 12px;
+ border-radius: 8px; }
+ .candidate-box:selected {
+ background-color: -st-accent-color;
+ color: -st-accent-fg-color; }
+ .candidate-box:hover {
- background-color: whitesmoke;
++ background-color: #e1e1e7;
++ color: #0c0c0e; }
+
+.candidate-page-button-box {
+ height: 2em; }
+ .vertical .candidate-page-button-box {
+ padding-top: 12px; }
+ .horizontal .candidate-page-button-box {
+ padding-left: 12px; }
+
+.candidate-page-button {
+ padding: 6px; }
+ .candidate-page-button StIcon {
+ icon-size: 16px; }
+
+.candidate-page-button-previous {
+ border-radius: 8px 0px 0px 8px;
+ border-right-width: 0;
+ box-shadow: none; }
+
+.candidate-page-button-next {
+ border-radius: 0px 8px 8px 0px;
+ box-shadow: none; }
+
+/* Notifications & Message Tray */
+.notification-banner {
+ min-height: 64px;
+ width: 34em;
+ box-shadow: 0 2px 4px 2px rgba(0, 0, 0, 0.05);
+ border-radius: 16px;
+ margin: 4px; }
+
+.notification-buttons-bin {
+ spacing: 0; }
+
+/* Modal Dialogs */
+.modal-dialog {
- color: #1b1b1b; }
++ background-color: #fafafb;
+ border-radius: 18px;
+ padding: 24px;
+ spacing: 18px;
+ box-shadow: 0 12px 8px 12px rgba(0, 0, 0, 0.03); }
+ .modal-dialog .modal-dialog-content-box {
+ padding-top: 12px;
+ spacing: 18px;
+ max-width: 28em; }
+ .modal-dialog .modal-dialog-button-box {
+ padding-top: 6px; }
+
+.dialog-list {
+ spacing: 18px; }
+ .dialog-list .dialog-list-title {
+ text-align: center; }
+ .dialog-list .dialog-list-scrollview {
+ max-height: 200px; }
+ .dialog-list .dialog-list-box {
+ spacing: 1em; }
+ .dialog-list .dialog-list-box .dialog-list-item {
+ spacing: 1em; }
+ .dialog-list .dialog-list-box .dialog-list-item .dialog-list-item-title {
+ font-weight: bold; }
+ .dialog-list .dialog-list-box .dialog-list-item .dialog-list-item-description {
- color: #f5c211;
- background-color: rgba(245, 194, 17, 0.1);
++ color: #161619; }
+
+/* End Session Dialog */
+.end-session-dialog {
+ width: 24em; }
+ .end-session-dialog .end-session-dialog-battery-warning,
+ .end-session-dialog .dialog-list-title {
- color: #f5c211; }
++ color: #e5a50a;
++ background-color: rgba(229, 165, 10, 0.1);
+ padding: 9px;
+ border-radius: 8px;
+ margin: 4px 0; }
+
+/* Message Dialog */
+.message-dialog-content {
+ spacing: 18px; }
+ .message-dialog-content .message-dialog-title {
+ text-align: center; }
+ .message-dialog-content .message-dialog-description {
+ text-align: center; }
+
+/* Run Dialog */
+.run-dialog {
+ width: 24em;
+ padding-bottom: 6px; }
+ .run-dialog .run-dialog-entry {
+ padding: 12px 9px; }
+ .run-dialog .run-dialog-description {
+ color: black; }
+
+/* Password or Authentication Dialog */
+.prompt-dialog {
+ width: 28em; }
+ .prompt-dialog .prompt-dialog-password-grid {
+ spacing-rows: 8px;
+ spacing-columns: 4px; }
+ .prompt-dialog .prompt-dialog-password-grid .prompt-dialog-password-entry {
+ width: auto; }
+ .prompt-dialog .prompt-dialog-password-grid .prompt-dialog-password-entry:ltr {
+ margin-left: 20px; }
+ .prompt-dialog .prompt-dialog-password-grid .prompt-dialog-password-entry:rtl {
+ margin-right: 20px; }
+ .prompt-dialog .prompt-dialog-password-layout {
+ spacing: 8px; }
+ .prompt-dialog .prompt-dialog-password-entry {
+ width: 20em;
+ padding: 12px 9px; }
+ .prompt-dialog .prompt-dialog-error-label,
+ .prompt-dialog .prompt-dialog-info-label,
+ .prompt-dialog .prompt-dialog-null-label {
+ text-align: center; }
+ .prompt-dialog .prompt-dialog-error-label {
- color: #f5c211; }
++ color: #e5a50a; }
+
+/* Polkit Dialog */
+.polkit-dialog-user-layout {
+ text-align: center;
+ spacing: 8px;
+ margin-bottom: 6px; }
+ .polkit-dialog-user-layout .polkit-dialog-user-root-label {
- background-color: #353535; }
++ color: #e5a50a; }
+
+/* Audio selection dialog */
+.audio-device-selection-dialog {
+ min-width: 24em; }
+ .audio-device-selection-dialog .audio-selection-box {
+ spacing: 12px; }
+ .audio-device-selection-dialog .audio-selection-box .audio-selection-device {
+ color: #ffffff;
- box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.5) !important;
- background-color: st-mix(-st-accent-color, rgba(53, 53, 53, 0.25), 5%); }
++ background-color: #2e2e33;
++ background-color: transparent; }
+ .audio-device-selection-dialog .audio-selection-box .audio-selection-device:focus {
+ color: #ffffff;
- background-color: st-mix(-st-accent-color, st-lighten(#353535, 7%), 5%); }
++ box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.2) !important;
++ background-color: st-mix(-st-accent-color, rgba(46, 46, 51, 0.25), 5%); }
+ .audio-device-selection-dialog .audio-selection-box .audio-selection-device:focus:hover {
- background-color: st-lighten(#353535, 7%); }
++ background-color: st-mix(-st-accent-color, st-lighten(#2e2e33, 7%), 5%); }
+ .audio-device-selection-dialog .audio-selection-box .audio-selection-device:hover {
+ color: #ffffff;
- background-color: st-lighten(#353535, 9%); }
++ background-color: st-lighten(#2e2e33, 7%); }
+ .audio-device-selection-dialog .audio-selection-box .audio-selection-device:active {
+ color: #ffffff;
- background-color: st-lighten(st-lighten(#353535, 9%), 7%); }
++ background-color: st-lighten(#2e2e33, 9%); }
+ .audio-device-selection-dialog .audio-selection-box .audio-selection-device:active:hover {
- background-color: st-mix(-st-accent-color, st-lighten(#353535, 9%), 5%); }
++ background-color: st-lighten(st-lighten(#2e2e33, 9%), 7%); }
+ .audio-device-selection-dialog .audio-selection-box .audio-selection-device:active:focus {
- background-color: st-lighten(#353535, 8%); }
++ background-color: st-mix(-st-accent-color, st-lighten(#2e2e33, 9%), 5%); }
+ .audio-device-selection-dialog .audio-selection-box .audio-selection-device:highlighted, .audio-device-selection-dialog .audio-selection-box .audio-selection-device:selected, .audio-device-selection-dialog .audio-selection-box .audio-selection-device:checked {
+ color: #ffffff;
- background-color: st-lighten(st-lighten(#353535, 8%), 7%); }
++ background-color: st-lighten(#2e2e33, 8%); }
+ .audio-device-selection-dialog .audio-selection-box .audio-selection-device:highlighted:hover, .audio-device-selection-dialog .audio-selection-box .audio-selection-device:selected:hover, .audio-device-selection-dialog .audio-selection-box .audio-selection-device:checked:hover {
- background-color: st-lighten(st-lighten(#353535, 8%), 9%); }
++ background-color: st-lighten(st-lighten(#2e2e33, 8%), 7%); }
+ .audio-device-selection-dialog .audio-selection-box .audio-selection-device:highlighted:active, .audio-device-selection-dialog .audio-selection-box .audio-selection-device:selected:active, .audio-device-selection-dialog .audio-selection-box .audio-selection-device:checked:active {
- background-color: #353535; }
++ background-color: st-lighten(st-lighten(#2e2e33, 8%), 9%); }
+ .audio-device-selection-dialog .audio-selection-box .audio-selection-device:insensitive {
+ color: st-transparentize(#ffffff, 0.6);
- .osd-monitor-label {
++ background-color: #2e2e33; }
+ .audio-device-selection-dialog .audio-selection-box .audio-selection-device:drop {
+ background-color: st-transparentize(-st-accent-color, 0.8);
+ box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.2); }
+ .audio-device-selection-dialog .audio-selection-box .audio-selection-device .audio-selection-device-box {
+ padding: 12px;
+ spacing: 12px; }
+ .audio-device-selection-dialog .audio-selection-box .audio-selection-device .audio-selection-device-icon {
+ icon-size: 64px; }
+
+/* Welcome dialog */
+.welcome-dialog-image {
+ background-image: url("resource:///org/gnome/shell/theme/gnome-shell-start.svg");
+ background-size: contain;
+ /* Reasonable maximum dimensions */
+ height: 300px;
+ width: 300px; }
+
+/* Access portal dialog */
+.access-dialog {
+ text-align: center; }
+
+/* OSD */
+.osd-window {
+ text-align: center;
+ font-weight: bold;
+ spacing: 12px;
+ padding: 12px 18px;
+ margin-bottom: 4em; }
+ .osd-window > * {
+ spacing: 8px; }
+ .osd-window StIcon {
+ icon-size: 32px; }
+ .osd-window StLabel:ltr {
+ margin-right: 6px; }
+ .osd-window StLabel:rtl {
+ margin-left: 6px; }
+ .osd-window .level {
+ margin-bottom: 4px;
+ min-width: 160px;
+ -barlevel-height: 6px;
+ -barlevel-background-color: rgba(255, 255, 255, 0.3);
+ -barlevel-active-background-color: #ffffff;
+ -barlevel-overdrive-color: #e01b24;
+ -barlevel-overdrive-separator-width: 3px; }
+ .osd-window .level:first-child {
+ margin-bottom: 0; }
+ .osd-window .level:ltr {
+ margin-right: 6px; }
+ .osd-window .level:rtl {
+ margin-left: 6px; }
+
- background-color: #353535; }
++.osd-monitor-label, .osd-break-countdown-label {
+ background-color: -st-accent-color;
+ color: -st-accent-fg-color;
+ border-radius: 16px;
+ font-size: 3em;
+ font-weight: bold;
+ font-feature-settings: "tnum";
+ margin: 12px;
+ padding: 12px;
+ text-align: center;
+ min-width: 1.5em; }
+
+/* Pad OSD */
+.pad-osd-window {
+ padding: 32px;
+ background-color: rgba(0, 0, 0, 0.8); }
+ .pad-osd-window .pad-osd-title-box {
+ spacing: 12px; }
+ .pad-osd-window .pad-osd-title-menu-box {
+ spacing: 6px; }
+
+.combo-box-label {
+ width: 15em; }
+
+/* App Switcher */
+.switcher-popup {
+ padding: 0;
+ spacing: 24px; }
+
+.switcher-list {
+ padding: 12px;
+ border-radius: 28px;
+ box-shadow: 0 8px 8px 0 rgba(0, 0, 0, 0.05); }
+ .switcher-list .switcher-list-item-container {
+ spacing: 12px; }
+ .switcher-list .item-box {
+ color: #ffffff;
- box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.5) !important;
- background-color: st-mix(-st-accent-color, rgba(53, 53, 53, 0.25), 5%); }
++ background-color: #2e2e33;
++ background-color: transparent; }
+ .switcher-list .item-box:focus {
+ color: #ffffff;
- background-color: st-mix(-st-accent-color, st-lighten(#353535, 7%), 5%); }
++ box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.2) !important;
++ background-color: st-mix(-st-accent-color, rgba(46, 46, 51, 0.25), 5%); }
+ .switcher-list .item-box:focus:hover {
- background-color: st-lighten(#353535, 7%); }
++ background-color: st-mix(-st-accent-color, st-lighten(#2e2e33, 7%), 5%); }
+ .switcher-list .item-box:hover {
+ color: #ffffff;
- background-color: st-lighten(#353535, 9%); }
++ background-color: st-lighten(#2e2e33, 7%); }
+ .switcher-list .item-box:active {
+ color: #ffffff;
- background-color: st-lighten(st-lighten(#353535, 9%), 7%); }
++ background-color: st-lighten(#2e2e33, 9%); }
+ .switcher-list .item-box:active:hover {
- background-color: st-mix(-st-accent-color, st-lighten(#353535, 9%), 5%); }
++ background-color: st-lighten(st-lighten(#2e2e33, 9%), 7%); }
+ .switcher-list .item-box:active:focus {
- background-color: st-lighten(#353535, 8%); }
++ background-color: st-mix(-st-accent-color, st-lighten(#2e2e33, 9%), 5%); }
+ .switcher-list .item-box:highlighted, .switcher-list .item-box:selected, .switcher-list .item-box:checked {
+ color: #ffffff;
- background-color: st-lighten(st-lighten(#353535, 8%), 7%); }
++ background-color: st-lighten(#2e2e33, 8%); }
+ .switcher-list .item-box:highlighted:hover, .switcher-list .item-box:selected:hover, .switcher-list .item-box:checked:hover {
- background-color: st-lighten(st-lighten(#353535, 8%), 9%); }
++ background-color: st-lighten(st-lighten(#2e2e33, 8%), 7%); }
+ .switcher-list .item-box:highlighted:active, .switcher-list .item-box:selected:active, .switcher-list .item-box:checked:active {
- background-color: #353535; }
++ background-color: st-lighten(st-lighten(#2e2e33, 8%), 9%); }
+ .switcher-list .item-box:insensitive {
+ color: st-transparentize(#ffffff, 0.6);
- background: rgba(40, 40, 40, 0.15); }
++ background-color: #2e2e33; }
+ .switcher-list .item-box:drop {
+ background-color: st-transparentize(-st-accent-color, 0.8);
+ box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.2); }
+ .switcher-list .item-box:hover {
+ background: none; }
+ .switcher-list .item-box:selected {
+ background-color: rgba(255, 255, 255, 0.2); }
+ .switcher-list .separator {
+ width: 1px;
- background-color: #dedede; }
++ background: rgba(34, 34, 38, 0.15); }
+ .switcher-list .thumbnail-box {
+ padding: 2px;
+ spacing: 6px; }
+ .switcher-list .thumbnail {
+ width: 256px;
+ border-radius: 8px; }
+
+.switcher-arrow {
+ border-color: rgba(255, 255, 255, 0.8);
+ color: rgba(255, 255, 255, 0.8); }
+ .switcher-arrow:highlighted {
+ border-color: #ffffff;
+ color: #ffffff; }
+
+.input-source-switcher-symbol {
+ font-size: 34pt;
+ width: 96px;
+ height: 96px; }
+
+.cycler-highlight {
+ border: 5px solid -st-accent-color; }
+
+/* Workspace Switcher */
+.workspace-switcher {
+ margin-bottom: 4em;
+ spacing: 12px;
+ padding: 12px 18px; }
+
+.ws-switcher-indicator {
+ background-color: rgba(255, 255, 255, 0.5);
+ padding: 2.6666666667px;
+ margin: 13.3333333333px;
+ border-radius: 32px; }
+ .ws-switcher-indicator:active {
+ background-color: #ffffff;
+ padding: 5.3333333333px;
+ margin: 10.6666666667px; }
+
+.screenshot-ui-panel {
+ border-radius: 32px;
+ padding: 18px;
+ padding-bottom: 12px;
+ margin-bottom: 4em;
+ spacing: 12px; }
+
+.screenshot-ui-close-button {
+ padding: 6px !important;
+ margin-top: 12px;
+ box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.05); }
+ .screenshot-ui-close-button.left {
+ margin-left: 12px; }
+ .screenshot-ui-close-button.right {
+ margin-right: 12px; }
+
+.screenshot-ui-type-button {
+ min-width: 48px;
+ padding: 12px 18px;
+ border-radius: 14px; }
+ .screenshot-ui-type-button .icon-label-button-container {
+ spacing: 0.409em; }
+ .screenshot-ui-type-button .icon-label-button-container > StIcon {
+ icon-size: 32px; }
+
+.screenshot-ui-capture-button {
+ width: 32px;
+ height: 32px;
+ border-radius: 999px;
+ border: 4px #ffffff;
+ padding: 4px; }
+ .screenshot-ui-capture-button .screenshot-ui-capture-button-circle {
+ background-color: #ffffff;
+ transition-duration: 200ms;
+ border-radius: 999px; }
+ .screenshot-ui-capture-button .screenshot-ui-capture-button-circle:hover, .screenshot-ui-capture-button .screenshot-ui-capture-button-circle:focus {
- color: #353535; }
++ background-color: #e1e1e7; }
+ .screenshot-ui-capture-button:hover .screenshot-ui-capture-button-circle, .screenshot-ui-capture-button:focus .screenshot-ui-capture-button-circle {
+ background-color: #cccccc; }
+ .screenshot-ui-capture-button:active .screenshot-ui-capture-button-circle {
+ background-color: gray; }
+ .screenshot-ui-capture-button:cast .screenshot-ui-capture-button-circle {
+ background-color: #c01c28; }
+ .screenshot-ui-capture-button:cast:hover .screenshot-ui-capture-button-circle, .screenshot-ui-capture-button:cast:focus .screenshot-ui-capture-button-circle {
+ background-color: #d61f2d; }
+ .screenshot-ui-capture-button:cast:active .screenshot-ui-capture-button-circle {
+ background-color: #a11722; }
+
+.screenshot-ui-shot-cast-container {
+ background-color: rgba(255, 255, 255, 0.1);
+ border-radius: 999px;
+ padding: 3px;
+ spacing: 3px; }
+
+.screenshot-ui-shot-cast-button {
+ padding: 6px 12px;
+ background-color: transparent;
+ border-radius: 999px; }
+ .screenshot-ui-shot-cast-button > StIcon {
+ icon-size: 16px; }
+ .screenshot-ui-shot-cast-button:hover, .screenshot-ui-shot-cast-button:focus {
+ background-color: rgba(255, 255, 255, 0.2); }
+ .screenshot-ui-shot-cast-button:active {
+ background-color: rgba(255, 255, 255, 0.5); }
+ .screenshot-ui-shot-cast-button:checked {
+ background-color: #ffffff;
- background-color: #282828; }
++ color: #2e2e33; }
+ .screenshot-ui-shot-cast-button:insensitive {
+ color: rgba(255, 255, 255, 0.5); }
+
+.screenshot-ui-area-indicator-shade {
+ background-color: rgba(0, 0, 0, 0.3); }
+
+.screenshot-ui-area-selector .screenshot-ui-area-indicator-shade {
+ background-color: rgba(0, 0, 0, 0.5); }
+
+.screenshot-ui-area-selector .screenshot-ui-area-indicator-selection {
+ border: 2px white; }
+
+.screenshot-ui-area-selector-handle {
+ border-radius: 999px;
+ background-color: white;
+ box-shadow: 0 1px 3px 2px rgba(0, 0, 0, 0.05);
+ width: 24px;
+ height: 24px; }
+
+.screenshot-ui-window-selector {
- background-color: whitesmoke;
++ background-color: #222226; }
+ .screenshot-ui-window-selector .screenshot-ui-window-selector-window-container {
+ margin: 100px; }
+ .screenshot-ui-window-selector:primary-monitor .screenshot-ui-window-selector-window-container {
+ margin-bottom: 200px; }
+
+.screenshot-ui-window-selector-window-border {
+ transition-duration: 200ms;
+ border-radius: 16px;
+ border: 6px transparent; }
+
+.screenshot-ui-window-selector-check {
+ transition-duration: 200ms;
+ color: transparent;
+ border-radius: 999px;
+ border-width: 12px;
+ icon-size: 24px; }
+
+.screenshot-ui-window-selector-window:hover .screenshot-ui-window-selector-window-border {
+ border-color: st-darken(-st-accent-color, 15%); }
+
+.screenshot-ui-window-selector-window:checked .screenshot-ui-window-selector-window-border {
+ border-color: -st-accent-color;
+ background-color: st-transparentize(-st-accent-color, 0.8); }
+
+.screenshot-ui-window-selector-window:checked .screenshot-ui-window-selector-check {
+ color: -st-accent-fg-color;
+ background-color: -st-accent-color; }
+
+.screenshot-ui-screen-selector {
+ transition-duration: 200ms;
+ background-color: rgba(0, 0, 0, 0.5); }
+ .screenshot-ui-screen-selector:hover {
+ background-color: rgba(0, 0, 0, 0.3); }
+ .screenshot-ui-screen-selector:active {
+ background-color: rgba(0, 0, 0, 0.7); }
+ .screenshot-ui-screen-selector:checked {
+ background-color: transparent;
+ border: 2px white; }
+
+.screenshot-ui-tooltip {
+ text-align: center;
+ -y-offset: 24px; }
+
+/* Top Bar */
+#panel {
- color: #282828;
++ background-color: #fafafb;
+ font-weight: bold;
+ height: 2.2em;
+ transition-duration: 250ms; }
+ #panel .panel-button {
+ transition-duration: 150ms;
+ border: 3px solid transparent;
+ background-color: transparent;
+ border-radius: 999px;
+ font-weight: bold;
- box-shadow: inset 0 0 0 100px rgba(40, 40, 40, 0.17); }
++ color: #222226;
+ box-shadow: inset 0 0 0 100px transparent;
+ -natural-hpadding: 12px;
+ -minimum-hpadding: 6px; }
+ #panel .panel-button:focus, #panel .panel-button:hover {
- box-shadow: inset 0 0 0 100px rgba(40, 40, 40, 0.28); }
++ box-shadow: inset 0 0 0 100px rgba(34, 34, 38, 0.17); }
+ #panel .panel-button:active, #panel .panel-button:checked {
- box-shadow: inset 0 0 0 100px rgba(40, 40, 40, 0.32); }
++ box-shadow: inset 0 0 0 100px rgba(34, 34, 38, 0.28); }
+ #panel .panel-button:active:hover, #panel .panel-button:checked:hover {
- background-color: #282828; }
++ box-shadow: inset 0 0 0 100px rgba(34, 34, 38, 0.32); }
+ #panel .panel-button .system-status-icon {
+ icon-size: 1.091em;
+ padding: 0 6px;
+ margin: 0 4px; }
+ #panel .panel-button .app-menu-icon {
+ -st-icon-style: symbolic; }
+ #panel .panel-button .panel-status-menu-box,
+ #panel .panel-button .panel-status-indicators-box {
+ spacing: 4px; }
+ #panel .panel-button .panel-status-menu-box > .system-status-icon,
+ #panel .panel-button .panel-status-indicators-box > .system-status-icon {
+ padding: 0; }
+ #panel .panel-button#panelActivities StBoxLayout {
+ padding: 0 0.2045em;
+ spacing: 5px; }
+ #panel .panel-button#panelActivities .workspace-dot {
+ border-radius: 999px;
+ min-width: 0.5455em;
+ min-height: 0.5455em;
- color: whitesmoke;
++ background-color: #222226; }
+ #panel .panel-button.screen-recording-indicator StBoxLayout, #panel .panel-button.screen-sharing-indicator StBoxLayout {
+ spacing: 0.409em; }
+ #panel .panel-button.screen-recording-indicator StIcon, #panel .panel-button.screen-sharing-indicator StIcon {
+ icon-size: 1.091em; }
+ #panel .panel-button.screen-recording-indicator {
+ transition-duration: 150ms;
+ border: 3px solid transparent;
+ background-color: transparent;
+ border-radius: 999px;
+ font-weight: bold;
- color: whitesmoke;
++ color: #fafafb;
+ box-shadow: inset 0 0 0 100px #c01c28; }
+ #panel .panel-button.screen-recording-indicator:focus, #panel .panel-button.screen-recording-indicator:hover {
+ box-shadow: inset 0 0 0 100px #aa1923; }
+ #panel .panel-button.screen-recording-indicator:active, #panel .panel-button.screen-recording-indicator:checked {
+ box-shadow: inset 0 0 0 100px #981620; }
+ #panel .panel-button.screen-recording-indicator:active:hover, #panel .panel-button.screen-recording-indicator:checked:hover {
+ box-shadow: inset 0 0 0 100px #8f151e; }
+ #panel .panel-button.screen-sharing-indicator {
+ transition-duration: 150ms;
+ border: 3px solid transparent;
+ background-color: transparent;
+ border-radius: 999px;
+ font-weight: bold;
- color: #282828;
++ color: #fafafb;
+ box-shadow: inset 0 0 0 100px #e66100; }
+ #panel .panel-button.screen-sharing-indicator:focus, #panel .panel-button.screen-sharing-indicator:hover {
+ box-shadow: inset 0 0 0 100px #cd5600; }
+ #panel .panel-button.screen-sharing-indicator:active, #panel .panel-button.screen-sharing-indicator:checked {
+ box-shadow: inset 0 0 0 100px #b84e00; }
+ #panel .panel-button.screen-sharing-indicator:active:hover, #panel .panel-button.screen-sharing-indicator:checked:hover {
+ box-shadow: inset 0 0 0 100px #ae4900; }
+ #panel .panel-button.clock-display {
+ transition-duration: 150ms;
+ border: 3px solid transparent;
+ background-color: transparent;
+ border-radius: 999px;
+ font-weight: bold;
- box-shadow: inset 0 0 0 100px rgba(40, 40, 40, 0.17); }
++ color: #222226;
+ box-shadow: inset 0 0 0 100px transparent;
+ background: none !important;
+ box-shadow: none !important;
+ border: none !important; }
+ #panel .panel-button.clock-display:focus, #panel .panel-button.clock-display:hover {
- box-shadow: inset 0 0 0 100px rgba(40, 40, 40, 0.28); }
++ box-shadow: inset 0 0 0 100px rgba(34, 34, 38, 0.17); }
+ #panel .panel-button.clock-display:active, #panel .panel-button.clock-display:checked {
- box-shadow: inset 0 0 0 100px rgba(40, 40, 40, 0.32); }
++ box-shadow: inset 0 0 0 100px rgba(34, 34, 38, 0.28); }
+ #panel .panel-button.clock-display:active:hover, #panel .panel-button.clock-display:checked:hover {
- box-shadow: inset 0 0 0 100px rgba(40, 40, 40, 0.17); }
++ box-shadow: inset 0 0 0 100px rgba(34, 34, 38, 0.32); }
+ #panel .panel-button.clock-display .clock {
+ transition-duration: 150ms;
+ border: 3px solid transparent;
+ border-radius: 999px; }
+ #panel .panel-button.clock-display:focus .clock, #panel .panel-button.clock-display:hover .clock {
- box-shadow: inset 0 0 0 100px rgba(40, 40, 40, 0.28); }
++ box-shadow: inset 0 0 0 100px rgba(34, 34, 38, 0.17); }
+ #panel .panel-button.clock-display:active .clock, #panel .panel-button.clock-display:checked .clock {
- box-shadow: inset 0 0 0 100px rgba(40, 40, 40, 0.32); }
++ box-shadow: inset 0 0 0 100px rgba(34, 34, 38, 0.28); }
+ #panel .panel-button.clock-display:active .clock:hover, #panel .panel-button.clock-display:checked .clock:hover {
- color: whitesmoke;
++ box-shadow: inset 0 0 0 100px rgba(34, 34, 38, 0.32); }
+ #panel .panel-button.clock-display .messages-indicator {
+ icon-size: 1.091em; }
+ #panel:overview, #panel.unlock-screen, #panel.login-screen {
+ background-color: transparent; }
+ #panel:overview .panel-button.screen-recording-indicator, #panel.unlock-screen .panel-button.screen-recording-indicator, #panel.login-screen .panel-button.screen-recording-indicator {
+ transition-duration: 150ms;
+ border: 3px solid transparent;
+ background-color: transparent;
+ border-radius: 999px;
+ font-weight: bold;
- color: whitesmoke;
++ color: #fafafb;
+ box-shadow: inset 0 0 0 100px #c01c28; }
+ #panel:overview .panel-button.screen-recording-indicator:focus, #panel:overview .panel-button.screen-recording-indicator:hover, #panel.unlock-screen .panel-button.screen-recording-indicator:focus, #panel.unlock-screen .panel-button.screen-recording-indicator:hover, #panel.login-screen .panel-button.screen-recording-indicator:focus, #panel.login-screen .panel-button.screen-recording-indicator:hover {
+ box-shadow: inset 0 0 0 100px #aa1923; }
+ #panel:overview .panel-button.screen-recording-indicator:active, #panel:overview .panel-button.screen-recording-indicator:checked, #panel.unlock-screen .panel-button.screen-recording-indicator:active, #panel.unlock-screen .panel-button.screen-recording-indicator:checked, #panel.login-screen .panel-button.screen-recording-indicator:active, #panel.login-screen .panel-button.screen-recording-indicator:checked {
+ box-shadow: inset 0 0 0 100px #981620; }
+ #panel:overview .panel-button.screen-recording-indicator:active:hover, #panel:overview .panel-button.screen-recording-indicator:checked:hover, #panel.unlock-screen .panel-button.screen-recording-indicator:active:hover, #panel.unlock-screen .panel-button.screen-recording-indicator:checked:hover, #panel.login-screen .panel-button.screen-recording-indicator:active:hover, #panel.login-screen .panel-button.screen-recording-indicator:checked:hover {
+ box-shadow: inset 0 0 0 100px #8f151e; }
+ #panel:overview .panel-button.screen-sharing-indicator, #panel.unlock-screen .panel-button.screen-sharing-indicator, #panel.login-screen .panel-button.screen-sharing-indicator {
+ transition-duration: 150ms;
+ border: 3px solid transparent;
+ background-color: transparent;
+ border-radius: 999px;
+ font-weight: bold;
- color: whitesmoke;
++ color: #fafafb;
+ box-shadow: inset 0 0 0 100px #e66100; }
+ #panel:overview .panel-button.screen-sharing-indicator:focus, #panel:overview .panel-button.screen-sharing-indicator:hover, #panel.unlock-screen .panel-button.screen-sharing-indicator:focus, #panel.unlock-screen .panel-button.screen-sharing-indicator:hover, #panel.login-screen .panel-button.screen-sharing-indicator:focus, #panel.login-screen .panel-button.screen-sharing-indicator:hover {
+ box-shadow: inset 0 0 0 100px #cd5600; }
+ #panel:overview .panel-button.screen-sharing-indicator:active, #panel:overview .panel-button.screen-sharing-indicator:checked, #panel.unlock-screen .panel-button.screen-sharing-indicator:active, #panel.unlock-screen .panel-button.screen-sharing-indicator:checked, #panel.login-screen .panel-button.screen-sharing-indicator:active, #panel.login-screen .panel-button.screen-sharing-indicator:checked {
+ box-shadow: inset 0 0 0 100px #b84e00; }
+ #panel:overview .panel-button.screen-sharing-indicator:active:hover, #panel:overview .panel-button.screen-sharing-indicator:checked:hover, #panel.unlock-screen .panel-button.screen-sharing-indicator:active:hover, #panel.unlock-screen .panel-button.screen-sharing-indicator:checked:hover, #panel.login-screen .panel-button.screen-sharing-indicator:active:hover, #panel.login-screen .panel-button.screen-sharing-indicator:checked:hover {
+ box-shadow: inset 0 0 0 100px #ae4900; }
+ #panel.unlock-screen .panel-button, #panel.login-screen .panel-button {
+ transition-duration: 150ms;
+ border: 3px solid transparent;
+ background-color: transparent;
+ border-radius: 999px;
+ font-weight: bold;
+ color: #ffffff;
+ box-shadow: inset 0 0 0 100px transparent; }
+ #panel.unlock-screen .panel-button:focus, #panel.unlock-screen .panel-button:hover, #panel.login-screen .panel-button:focus, #panel.login-screen .panel-button:hover {
+ box-shadow: inset 0 0 0 100px rgba(255, 255, 255, 0.17); }
+ #panel.unlock-screen .panel-button:active, #panel.unlock-screen .panel-button:checked, #panel.login-screen .panel-button:active, #panel.login-screen .panel-button:checked {
+ box-shadow: inset 0 0 0 100px rgba(255, 255, 255, 0.28); }
+ #panel.unlock-screen .panel-button:active:hover, #panel.unlock-screen .panel-button:checked:hover, #panel.login-screen .panel-button:active:hover, #panel.login-screen .panel-button:checked:hover {
+ box-shadow: inset 0 0 0 100px rgba(255, 255, 255, 0.32); }
+ #panel.unlock-screen .panel-button.clock-display, #panel.login-screen .panel-button.clock-display {
+ transition-duration: 150ms;
+ border: 3px solid transparent;
+ background-color: transparent;
+ border-radius: 999px;
+ font-weight: bold;
+ color: #ffffff;
+ box-shadow: inset 0 0 0 100px transparent;
+ background: none !important;
+ box-shadow: none !important;
+ border: none !important; }
+ #panel.unlock-screen .panel-button.clock-display:focus, #panel.unlock-screen .panel-button.clock-display:hover, #panel.login-screen .panel-button.clock-display:focus, #panel.login-screen .panel-button.clock-display:hover {
+ box-shadow: inset 0 0 0 100px rgba(255, 255, 255, 0.17); }
+ #panel.unlock-screen .panel-button.clock-display:active, #panel.unlock-screen .panel-button.clock-display:checked, #panel.login-screen .panel-button.clock-display:active, #panel.login-screen .panel-button.clock-display:checked {
+ box-shadow: inset 0 0 0 100px rgba(255, 255, 255, 0.28); }
+ #panel.unlock-screen .panel-button.clock-display:active:hover, #panel.unlock-screen .panel-button.clock-display:checked:hover, #panel.login-screen .panel-button.clock-display:active:hover, #panel.login-screen .panel-button.clock-display:checked:hover {
+ box-shadow: inset 0 0 0 100px rgba(255, 255, 255, 0.32); }
+ #panel.unlock-screen .panel-button.clock-display .clock, #panel.login-screen .panel-button.clock-display .clock {
+ transition-duration: 150ms;
+ border: 3px solid transparent;
+ border-radius: 999px; }
+ #panel.unlock-screen .panel-button.clock-display:focus .clock, #panel.unlock-screen .panel-button.clock-display:hover .clock, #panel.login-screen .panel-button.clock-display:focus .clock, #panel.login-screen .panel-button.clock-display:hover .clock {
+ box-shadow: inset 0 0 0 100px rgba(255, 255, 255, 0.17); }
+ #panel.unlock-screen .panel-button.clock-display:active .clock, #panel.unlock-screen .panel-button.clock-display:checked .clock, #panel.login-screen .panel-button.clock-display:active .clock, #panel.login-screen .panel-button.clock-display:checked .clock {
+ box-shadow: inset 0 0 0 100px rgba(255, 255, 255, 0.28); }
+ #panel.unlock-screen .panel-button.clock-display:active .clock:hover, #panel.unlock-screen .panel-button.clock-display:checked .clock:hover, #panel.login-screen .panel-button.clock-display:active .clock:hover, #panel.login-screen .panel-button.clock-display:checked .clock:hover {
+ box-shadow: inset 0 0 0 100px rgba(255, 255, 255, 0.32); }
+ #panel:overview .panel-button {
+ transition-duration: 150ms;
+ border: 3px solid transparent;
+ background-color: transparent;
+ border-radius: 999px;
+ font-weight: bold;
- box-shadow: inset 0 0 0 100px rgba(245, 245, 245, 0.17); }
++ color: #fafafb;
+ box-shadow: inset 0 0 0 100px transparent; }
+ #panel:overview .panel-button:focus, #panel:overview .panel-button:hover {
- box-shadow: inset 0 0 0 100px rgba(245, 245, 245, 0.28); }
++ box-shadow: inset 0 0 0 100px rgba(250, 250, 251, 0.17); }
+ #panel:overview .panel-button:active, #panel:overview .panel-button:checked {
- box-shadow: inset 0 0 0 100px rgba(245, 245, 245, 0.32); }
++ box-shadow: inset 0 0 0 100px rgba(250, 250, 251, 0.28); }
+ #panel:overview .panel-button:active:hover, #panel:overview .panel-button:checked:hover {
- background-color: whitesmoke; }
++ box-shadow: inset 0 0 0 100px rgba(250, 250, 251, 0.32); }
+ #panel:overview .panel-button#panelActivities .workspace-dot {
- color: whitesmoke;
++ background-color: #fafafb; }
+ #panel:overview .panel-button.clock-display {
+ transition-duration: 150ms;
+ border: 3px solid transparent;
+ background-color: transparent;
+ border-radius: 999px;
+ font-weight: bold;
- box-shadow: inset 0 0 0 100px rgba(245, 245, 245, 0.17); }
++ color: #fafafb;
+ box-shadow: inset 0 0 0 100px transparent;
+ background: none !important;
+ box-shadow: none !important;
+ border: none !important; }
+ #panel:overview .panel-button.clock-display:focus, #panel:overview .panel-button.clock-display:hover {
- box-shadow: inset 0 0 0 100px rgba(245, 245, 245, 0.28); }
++ box-shadow: inset 0 0 0 100px rgba(250, 250, 251, 0.17); }
+ #panel:overview .panel-button.clock-display:active, #panel:overview .panel-button.clock-display:checked {
- box-shadow: inset 0 0 0 100px rgba(245, 245, 245, 0.32); }
++ box-shadow: inset 0 0 0 100px rgba(250, 250, 251, 0.28); }
+ #panel:overview .panel-button.clock-display:active:hover, #panel:overview .panel-button.clock-display:checked:hover {
- box-shadow: inset 0 0 0 100px rgba(245, 245, 245, 0.17); }
++ box-shadow: inset 0 0 0 100px rgba(250, 250, 251, 0.32); }
+ #panel:overview .panel-button.clock-display .clock {
+ transition-duration: 150ms;
+ border: 3px solid transparent;
+ border-radius: 999px; }
+ #panel:overview .panel-button.clock-display:focus .clock, #panel:overview .panel-button.clock-display:hover .clock {
- box-shadow: inset 0 0 0 100px rgba(245, 245, 245, 0.28); }
++ box-shadow: inset 0 0 0 100px rgba(250, 250, 251, 0.17); }
+ #panel:overview .panel-button.clock-display:active .clock, #panel:overview .panel-button.clock-display:checked .clock {
- box-shadow: inset 0 0 0 100px rgba(245, 245, 245, 0.32); }
++ box-shadow: inset 0 0 0 100px rgba(250, 250, 251, 0.28); }
+ #panel:overview .panel-button.clock-display:active .clock:hover, #panel:overview .panel-button.clock-display:checked .clock:hover {
- .quick-toggle, .quick-menu-toggle {
++ box-shadow: inset 0 0 0 100px rgba(250, 250, 251, 0.32); }
+ #panel .panel-status-indicators-box,
+ #panel .panel-status-menu-box {
+ spacing: 2px; }
+ #panel .power-status.panel-status-indicators-box {
+ spacing: 0; }
+ #panel .privacy-indicator {
+ color: #e66100; }
+
+#appMenu {
+ spacing: 0.409em; }
+ #appMenu .label-shadow {
+ color: transparent; }
+
+#appMenu .panel-status-menu-box {
+ padding: 0 0.409em;
+ spacing: 0.409em; }
+
+.clock-display-box {
+ spacing: 2px; }
+ .clock-display-box .clock {
+ padding-left: 0.818em;
+ padding-right: 0.818em; }
+
+/* Activities Ripple */
+.ripple-box {
+ background-color: rgba(255, 255, 255, 0.2);
+ box-shadow: 0 0 2px 2px rgba(255, 255, 255, 0.2);
+ width: 52px;
+ height: 52px;
+ border-radius: 0 0 52px 0; }
+ .ripple-box:rtl {
+ border-radius: 0 0 0 52px; }
+
+.quick-settings {
+ padding: 18px;
+ border-radius: 36px; }
+ .quick-settings .icon-button, .quick-settings .login-dialog-button.cancel-button, .quick-settings .login-dialog-button.switch-user-button, .quick-settings .login-dialog-button.login-dialog-session-list-button, .quick-settings .calendar .calendar-month-header .pager-button, .calendar .calendar-month-header .quick-settings .pager-button, .quick-settings .message .message-header .message-expand-button, .message .message-header .quick-settings .message-expand-button,
+ .quick-settings .message .message-header .message-close-button,
+ .message .message-header .quick-settings .message-close-button, .quick-settings .screenshot-ui-show-pointer-button, .quick-settings .button {
+ padding: 10.5px; }
+
+.quick-settings-grid {
+ spacing-rows: 12px;
+ spacing-columns: 12px; }
+
- min-height: 3.273em;
- border: none; }
++.quick-toggle, .quick-toggle-has-menu {
+ border-radius: 999px;
+ min-width: 12em;
+ max-width: 12em;
- background-color: none;
++ min-height: 3.273em; }
+
+.quick-toggle {
- .quick-toggle .quick-toggle-title {
- font-weight: bold; }
- .quick-toggle StBoxLayout > .quick-toggle-subtitle {
+ /* Move padding into the box; this is to allow menu arrows
+ to extend to the border */ }
+ .quick-toggle > StBoxLayout {
+ spacing: 9px; }
+ .quick-toggle.button {
+ padding: 0; }
+ .quick-toggle > StBoxLayout {
+ padding: 0 12px; }
+ .quick-toggle:ltr > StBoxLayout {
+ padding-left: 15px; }
+ .quick-toggle:rtl > StBoxLayout {
+ padding-right: 15px; }
- .quick-menu-toggle .quick-toggle {
++ .quick-toggle .quick-toggle-subtitle {
+ font-weight: normal; }
+ .quick-toggle .quick-toggle-icon {
+ icon-size: 1.091em; }
+
- .quick-menu-toggle .quick-toggle:ltr {
++.quick-toggle-has-menu .quick-toggle {
+ min-width: auto;
+ max-width: auto; }
- .quick-menu-toggle .quick-toggle:ltr > StBoxLayout {
- padding-right: 0.6135em; }
- .quick-menu-toggle .quick-toggle:rtl {
++ .quick-toggle-has-menu .quick-toggle:ltr {
+ border-radius: 999px 0 0 999px; }
- .quick-menu-toggle .quick-toggle:rtr > StBoxLayout {
- padding-left: 0.6135em; }
- .quick-menu-toggle .quick-toggle:ltr:last-child {
++ .quick-toggle-has-menu .quick-toggle:ltr > StBoxLayout {
++ padding-right: 0.6135em; }
++ .quick-toggle-has-menu .quick-toggle:rtl {
+ border-radius: 0 999px 999px 0; }
- .quick-menu-toggle .quick-toggle:rtl:last-child {
++ .quick-toggle-has-menu .quick-toggle:rtl > StBoxLayout {
++ padding-left: 0.6135em; }
++ .quick-toggle-has-menu .quick-toggle:ltr:last-child {
+ border-radius: 999px; }
- .quick-menu-toggle .quick-toggle-arrow {
- padding: 0.409em 0.71575em;
- border-width: 0;
- border-color: rgba(40, 40, 40, 0.25); }
- .quick-menu-toggle .quick-toggle-arrow:checked {
- border-color: st-darken(-st-accent-color, 15%); }
- .quick-menu-toggle .quick-toggle-arrow:ltr {
- border-radius: 0 999px 999px 0;
- border-left-width: 1px; }
- .quick-menu-toggle .quick-toggle-arrow:rtl {
- border-radius: 999px 0 0 999px;
- border-right-width: 1px; }
++ .quick-toggle-has-menu .quick-toggle:rtl:last-child {
+ border-radius: 999px; }
+
- color: #282828;
- box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.5) !important;
- background-color: st-mix(-st-accent-color, st-mix(#282828, whitesmoke, 12%), 5%); }
++.quick-toggle-has-menu .quick-toggle-menu-button {
++ padding: 0.409em 0.71575em; }
++ .quick-toggle-has-menu .quick-toggle-menu-button:ltr {
++ border-radius: 0 999px 999px 0; }
++ .quick-toggle-has-menu .quick-toggle-menu-button:rtl {
++ border-radius: 999px 0 0 999px; }
++
++.quick-toggle-has-menu .quick-toggle-separator {
++ width: 1px; }
++
++.quick-toggle-has-menu .quick-toggle-menu-button {
++ color: #222226;
++ background-color: st-mix(#222226, #ececf0, 12%); }
++ .quick-toggle-has-menu .quick-toggle-menu-button:focus {
++ color: #222226;
++ box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.2) !important;
++ background-color: st-mix(-st-accent-color, st-mix(#222226, #ececf0, 12%), 5%); }
++ .quick-toggle-has-menu .quick-toggle-menu-button:focus:hover {
++ background-color: st-mix(-st-accent-color, st-darken(st-mix(#222226, #ececf0, 12%), 4%), 5%); }
++ .quick-toggle-has-menu .quick-toggle-menu-button:hover {
++ color: #222226;
++ background-color: st-darken(st-mix(#222226, #ececf0, 12%), 4%); }
++ .quick-toggle-has-menu .quick-toggle-menu-button:active {
++ color: #222226;
++ background-color: st-darken(st-mix(#222226, #ececf0, 12%), 9%); }
++ .quick-toggle-has-menu .quick-toggle-menu-button:active:hover {
++ background-color: st-darken(st-darken(st-mix(#222226, #ececf0, 12%), 9%), 4%); }
++ .quick-toggle-has-menu .quick-toggle-menu-button:active:focus {
++ background-color: st-mix(-st-accent-color, st-darken(st-mix(#222226, #ececf0, 12%), 9%), 5%); }
++ .quick-toggle-has-menu .quick-toggle-menu-button:checked {
++ color: -st-accent-fg-color;
++ background-color: st-mix(-st-accent-color, #222226, 92%); }
++ .quick-toggle-has-menu .quick-toggle-menu-button:checked:focus {
++ color: -st-accent-fg-color;
++ box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.2) !important;
++ box-shadow: inset 0 0 0 2px st-transparentize(st-darken(-st-accent-color, 20%), 0.2) !important;
++ background-color: st-mix(-st-accent-color, st-mix(-st-accent-color, #222226, 92%), 5%); }
++ .quick-toggle-has-menu .quick-toggle-menu-button:checked:focus:hover {
++ background-color: st-mix(-st-accent-color, st-darken(st-mix(-st-accent-color, #222226, 92%), 4%), 5%); }
++ .quick-toggle-has-menu .quick-toggle-menu-button:checked:hover {
++ color: -st-accent-fg-color;
++ background-color: st-darken(st-mix(-st-accent-color, #222226, 92%), 4%); }
++ .quick-toggle-has-menu .quick-toggle-menu-button:checked:active {
++ color: -st-accent-fg-color;
++ background-color: st-darken(st-mix(-st-accent-color, #222226, 92%), 9%); }
++ .quick-toggle-has-menu .quick-toggle-menu-button:checked:active:hover {
++ background-color: st-darken(st-darken(st-mix(-st-accent-color, #222226, 92%), 9%), 4%); }
++ .quick-toggle-has-menu .quick-toggle-menu-button:checked:active:focus {
++ background-color: st-mix(-st-accent-color, st-darken(st-mix(-st-accent-color, #222226, 92%), 9%), 5%); }
++
++.quick-toggle-has-menu:checked .quick-toggle-separator {
++ background-color: st-mix(-st-accent-fg-color, -st-accent-color, 20%); }
++
++.quick-toggle-has-menu .quick-toggle-separator {
++ background-color: rgba(34, 34, 38, 0.25); }
+
+.quick-slider > StBoxLayout {
+ spacing: 6px; }
+
+.quick-slider .icon-button, .quick-slider .login-dialog-button.cancel-button, .quick-slider .login-dialog-button.switch-user-button, .quick-slider .login-dialog-button.login-dialog-session-list-button, .quick-slider .calendar .calendar-month-header .pager-button, .calendar .calendar-month-header .quick-slider .pager-button, .quick-slider .message .message-header .message-expand-button, .message .message-header .quick-slider .message-expand-button,
+.quick-slider .message .message-header .message-close-button,
+.message .message-header .quick-slider .message-close-button, .quick-slider .screenshot-ui-show-pointer-button {
+ padding: 6px; }
+
+.quick-slider .slider-bin {
+ padding: 6px;
+ border-radius: 999px; }
+ .quick-slider .slider-bin:focus {
- background-color: st-mix(-st-accent-color, st-darken(st-mix(#282828, whitesmoke, 12%), 4%), 5%); }
++ color: #222226;
++ box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.2) !important;
++ background-color: st-mix(-st-accent-color, st-mix(#222226, #fafafb, 12%), 5%); }
+ .quick-slider .slider-bin:focus:hover {
- color: #282828;
- background-color: st-mix(#282828, whitesmoke, 12%); }
++ background-color: st-mix(-st-accent-color, st-darken(st-mix(#222226, #fafafb, 12%), 4%), 5%); }
+
+.quick-toggle-menu {
+ border-radius: 24px;
+ margin: 12px 18px 0; }
+ .quick-toggle-menu:insensitive {
- background-color: rgba(40, 40, 40, 0.2); }
++ color: #222226;
++ background-color: st-mix(#222226, #fafafb, 12%); }
+ .quick-toggle-menu .popup-menu-item > StIcon {
+ -st-icon-style: symbolic;
+ icon-size: 1.091em; }
+ .quick-toggle-menu .header {
+ spacing-rows: 3px;
+ spacing-columns: 12px;
+ padding-bottom: 12px; }
+ .quick-toggle-menu .header .icon {
+ icon-size: 1.6365em;
+ border-radius: 999px;
+ padding: 9px;
- color: #282828;
- background-color: st-mix(#282828, whitesmoke, 12%);
++ background-color: rgba(34, 34, 38, 0.2); }
+ .quick-toggle-menu .header .icon.active {
+ background-color: -st-accent-color;
+ color: -st-accent-fg-color; }
+
+.quick-settings-system-item > StBoxLayout {
+ spacing: 12px; }
+
+.quick-settings-system-item .power-item {
+ min-height: 0;
+ min-width: 0; }
+ .quick-settings-system-item .power-item:insensitive {
- color: rgba(40, 40, 40, 0.5); }
++ color: #222226;
++ background-color: st-mix(#222226, #fafafb, 12%);
+ background-color: transparent; }
+
+.nm-network-item .wireless-secure-icon {
+ icon-size: 0.5455em; }
+
+.bt-device-item .popup-menu-icon {
+ -st-icon-style: symbolic; }
+
+.bt-menu-placeholder.popup-menu-item {
+ text-align: center;
+ padding: 2em 4em; }
+
+.device-subtitle {
- background-color: rgba(40, 40, 40, 0.13); }
++ color: rgba(34, 34, 38, 0.5); }
+
+.keyboard-brightness-level {
+ spacing: 6px; }
+
+.background-apps-quick-toggle {
+ min-height: 2.728em;
+ background-color: transparent; }
+ .background-apps-quick-toggle StIcon {
+ icon-size: 1.091em !important; }
+
+.background-app-item .popup-menu-icon {
+ icon-size: 32px !important;
+ -st-icon-style: regular !important; }
+
+.background-app-item .icon-button, .background-app-item .login-dialog-button.cancel-button, .background-app-item .login-dialog-button.switch-user-button, .background-app-item .login-dialog-button.login-dialog-session-list-button, .background-app-item .calendar .calendar-month-header .pager-button, .calendar .calendar-month-header .background-app-item .pager-button, .background-app-item .message .message-header .message-expand-button, .message .message-header .background-app-item .message-expand-button,
+.background-app-item .message .message-header .message-close-button,
+.message .message-header .background-app-item .message-close-button, .background-app-item .screenshot-ui-show-pointer-button {
+ padding: 6px;
- background-color: rgba(40, 40, 40, 0.22); }
++ background-color: rgba(34, 34, 38, 0.13); }
+ .background-app-item .icon-button:hover, .background-app-item .login-dialog-button.cancel-button:hover, .background-app-item .login-dialog-button.switch-user-button:hover, .background-app-item .login-dialog-button.login-dialog-session-list-button:hover, .background-app-item .calendar .calendar-month-header .pager-button:hover, .calendar .calendar-month-header .background-app-item .pager-button:hover, .background-app-item .message .message-header .message-expand-button:hover, .message .message-header .background-app-item .message-expand-button:hover,
+ .background-app-item .message .message-header .message-close-button:hover,
+ .message .message-header .background-app-item .message-close-button:hover, .background-app-item .screenshot-ui-show-pointer-button:hover {
- background-color: rgba(40, 40, 40, 0.31); }
++ background-color: rgba(34, 34, 38, 0.22); }
+ .background-app-item .icon-button:active, .background-app-item .login-dialog-button.cancel-button:active, .background-app-item .login-dialog-button.switch-user-button:active, .background-app-item .login-dialog-button.login-dialog-session-list-button:active, .background-app-item .calendar .calendar-month-header .pager-button:active, .calendar .calendar-month-header .background-app-item .pager-button:active, .background-app-item .message .message-header .message-expand-button:active, .message .message-header .background-app-item .message-expand-button:active,
+ .background-app-item .message .message-header .message-close-button:active,
+ .message .message-header .background-app-item .message-close-button:active, .background-app-item .screenshot-ui-show-pointer-button:active {
- color: #282828; }
++ background-color: rgba(34, 34, 38, 0.31); }
+
+.background-app-item .spinner {
+ padding: 6px; }
+
+.background-app-item.popup-inactive-menu-item {
- background-color: #282828; }
++ color: #222226; }
+
+/* OVERVIEW */
+.secondary-monitor-workspaces {
+ spacing: 12px; }
+
+#overviewGroup {
- background-color: rgba(71, 71, 71, 0.98);
- color: whitesmoke;
++ background-color: #222226; }
+
+/* Window Picker */
+.window-picker {
+ spacing: 6px; }
+
+.window-close, .screenshot-ui-close-button {
- background-color: rgba(88, 88, 88, 0.98); }
++ background-color: rgba(63, 63, 70, 0.98);
++ color: #fafafb;
+ border-radius: 999px;
+ box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.05);
+ padding: 3px;
+ height: 32px;
+ width: 32px;
+ transition-duration: 100ms;
+ border: 2px solid transparent; }
+ .window-close StIcon, .screenshot-ui-close-button StIcon {
+ icon-size: 24px; }
+ .window-close:hover, .screenshot-ui-close-button:hover {
- background-color: rgba(104, 104, 104, 0.98); }
++ background-color: rgba(80, 80, 89, 0.98); }
+ .window-close:active, .screenshot-ui-close-button:active {
- background-color: #3d3d3d;
- color: whitesmoke;
++ background-color: rgba(94, 94, 105, 0.98); }
+
+.workspace-background {
+ border-radius: 30px;
+ background-color: rgba(3, 2, 1, 0);
+ box-shadow: 0 4px 16px 4px rgba(0, 0, 0, 0.05); }
+
+.search-entry {
+ border-radius: 999px;
+ margin-top: 12px;
+ margin-bottom: 6px;
+ width: 24em; }
+ .search-entry .search-entry-icon {
+ icon-size: 1.091em;
+ margin-top: 2px;
+ padding: 0 4px; }
+
+/* Search */
+#searchResults {
+ margin: 0 4px; }
+
+#searchResultsContent {
+ max-width: 1044px; }
+
+.search-section {
+ spacing: 18px; }
+ .search-section .search-section-separator {
+ height: 8px;
+ background-color: transparent; }
+
+.search-section-content {
- color: whitesmoke;
- background-color: #3d3d3d;
++ background-color: #38383b;
++ color: #fafafb;
+ border-radius: 24px;
+ padding: 12px;
+ margin: 0 12px;
+ border: 2px solid transparent; }
+
+.list-search-result, .search-provider-icon {
- color: whitesmoke;
- box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.5) !important;
- background-color: st-mix(-st-accent-color, rgba(61, 61, 61, 0.25), 5%); }
++ color: #fafafb;
++ background-color: #38383b;
++ background-color: transparent;
+ border-radius: 13.2px; }
+ .list-search-result:focus, .search-provider-icon:focus {
- background-color: st-mix(-st-accent-color, st-lighten(#3d3d3d, 7%), 5%); }
++ color: #fafafb;
++ box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.2) !important;
++ background-color: st-mix(-st-accent-color, rgba(56, 56, 59, 0.25), 5%); }
+ .list-search-result:focus:hover, .search-provider-icon:focus:hover {
- color: whitesmoke;
- background-color: st-lighten(#3d3d3d, 7%); }
++ background-color: st-mix(-st-accent-color, st-lighten(#38383b, 7%), 5%); }
+ .list-search-result:hover, .search-provider-icon:hover {
- color: whitesmoke;
- background-color: st-lighten(#3d3d3d, 9%); }
++ color: #fafafb;
++ background-color: st-lighten(#38383b, 7%); }
+ .list-search-result:active, .search-provider-icon:active {
- background-color: st-lighten(st-lighten(#3d3d3d, 9%), 7%); }
++ color: #fafafb;
++ background-color: st-lighten(#38383b, 9%); }
+ .list-search-result:active:hover, .search-provider-icon:active:hover {
- background-color: st-mix(-st-accent-color, st-lighten(#3d3d3d, 9%), 5%); }
++ background-color: st-lighten(st-lighten(#38383b, 9%), 7%); }
+ .list-search-result:active:focus, .search-provider-icon:active:focus {
- color: whitesmoke;
- background-color: st-lighten(#3d3d3d, 8%); }
++ background-color: st-mix(-st-accent-color, st-lighten(#38383b, 9%), 5%); }
+ .list-search-result:highlighted, .search-provider-icon:highlighted, .list-search-result:selected, .search-provider-icon:selected, .list-search-result:checked, .search-provider-icon:checked {
- background-color: st-lighten(st-lighten(#3d3d3d, 8%), 7%); }
++ color: #fafafb;
++ background-color: st-lighten(#38383b, 8%); }
+ .list-search-result:highlighted:hover, .search-provider-icon:highlighted:hover, .list-search-result:selected:hover, .search-provider-icon:selected:hover, .list-search-result:checked:hover, .search-provider-icon:checked:hover {
- background-color: st-lighten(st-lighten(#3d3d3d, 8%), 9%); }
++ background-color: st-lighten(st-lighten(#38383b, 8%), 7%); }
+ .list-search-result:highlighted:active, .search-provider-icon:highlighted:active, .list-search-result:selected:active, .search-provider-icon:selected:active, .list-search-result:checked:active, .search-provider-icon:checked:active {
- color: st-transparentize(whitesmoke, 0.6);
- background-color: #3d3d3d; }
++ background-color: st-lighten(st-lighten(#38383b, 8%), 9%); }
+ .list-search-result:insensitive, .search-provider-icon:insensitive {
- color: rgba(245, 245, 245, 0.8); }
++ color: st-transparentize(#fafafb, 0.6);
++ background-color: #38383b; }
+ .list-search-result:drop, .search-provider-icon:drop {
+ background-color: st-transparentize(-st-accent-color, 0.8);
+ box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.2); }
+
+.search-statustext {
- color: whitesmoke; }
++ color: rgba(250, 250, 251, 0.8); }
+
+.grid-search-results {
+ spacing: 30px; }
+
+.search-provider-icon:ltr {
+ margin-right: 4px; }
+
+.search-provider-icon:rtl {
+ margin-left: 4px; }
+
+.search-provider-icon .list-search-provider-content {
+ spacing: 12px; }
+ .search-provider-icon .list-search-provider-content .list-search-provider-details {
+ width: 120px;
- color: #959595; }
++ color: #fafafb; }
+
+.list-search-results {
+ spacing: 6px; }
+
+.list-search-result .list-search-result-content {
+ spacing: 6px; }
+
+.list-search-result .list-search-result-title {
+ spacing: 12px; }
+
+.list-search-result .list-search-result-description {
- background-color: #3d3d3d;
++ color: #949497; }
+
+/* Dash */
+#dash {
+ padding-left: 6px;
+ padding-right: 6px; }
+ #dash .dash-background {
- color: whitesmoke;
- background-color: #3d3d3d; }
++ background-color: #38383b;
+ border-radius: 28px;
+ padding-top: 12px;
+ padding-bottom: 12px;
+ padding-left: 10px;
+ padding-right: 10px; }
+ #dash .dash-item-container .placeholder {
+ background-image: none;
+ background-size: contain;
+ height: 32px; }
+ #dash .dash-item-container .empty-dash-drop-target {
+ width: 32px;
+ height: 32px; }
+ #dash .dash-item-container .show-apps,
+ #dash .dash-item-container .overview-tile,
+ #dash .dash-item-container .grid-search-result {
+ margin: 0 2px;
+ padding-bottom: 12px; }
+ #dash .dash-item-container .show-apps .overview-icon,
+ #dash .dash-item-container .overview-tile .overview-icon,
+ #dash .dash-item-container .grid-search-result .overview-icon {
- color: whitesmoke;
- box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.5) !important;
- background-color: st-mix(-st-accent-color, rgba(61, 61, 61, 0.25), 5%); }
++ color: #fafafb;
++ background-color: #38383b; }
+ #dash .dash-item-container .show-apps:focus .overview-icon,
+ #dash .dash-item-container .overview-tile:focus .overview-icon,
+ #dash .dash-item-container .grid-search-result:focus .overview-icon {
- background-color: st-mix(-st-accent-color, st-lighten(#3d3d3d, 7%), 5%); }
++ color: #fafafb;
++ box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.2) !important;
++ background-color: st-mix(-st-accent-color, rgba(56, 56, 59, 0.25), 5%); }
+ #dash .dash-item-container .show-apps:focus .overview-icon:hover,
+ #dash .dash-item-container .overview-tile:focus .overview-icon:hover,
+ #dash .dash-item-container .grid-search-result:focus .overview-icon:hover {
- color: whitesmoke;
- background-color: st-lighten(#3d3d3d, 7%); }
++ background-color: st-mix(-st-accent-color, st-lighten(#38383b, 7%), 5%); }
+ #dash .dash-item-container .show-apps:hover .overview-icon,
+ #dash .dash-item-container .overview-tile:hover .overview-icon,
+ #dash .dash-item-container .grid-search-result:hover .overview-icon {
- color: whitesmoke;
- background-color: st-lighten(#3d3d3d, 9%); }
++ color: #fafafb;
++ background-color: st-lighten(#38383b, 7%); }
+ #dash .dash-item-container .show-apps:active .overview-icon,
+ #dash .dash-item-container .overview-tile:active .overview-icon,
+ #dash .dash-item-container .grid-search-result:active .overview-icon {
- background-color: st-lighten(st-lighten(#3d3d3d, 9%), 7%); }
++ color: #fafafb;
++ background-color: st-lighten(#38383b, 9%); }
+ #dash .dash-item-container .show-apps:active .overview-icon:hover,
+ #dash .dash-item-container .overview-tile:active .overview-icon:hover,
+ #dash .dash-item-container .grid-search-result:active .overview-icon:hover {
- background-color: st-mix(-st-accent-color, st-lighten(#3d3d3d, 9%), 5%); }
++ background-color: st-lighten(st-lighten(#38383b, 9%), 7%); }
+ #dash .dash-item-container .show-apps:active .overview-icon:focus,
+ #dash .dash-item-container .overview-tile:active .overview-icon:focus,
+ #dash .dash-item-container .grid-search-result:active .overview-icon:focus {
- color: whitesmoke;
- background-color: st-lighten(#3d3d3d, 8%); }
++ background-color: st-mix(-st-accent-color, st-lighten(#38383b, 9%), 5%); }
+ #dash .dash-item-container .show-apps:checked .overview-icon,
+ #dash .dash-item-container .overview-tile:checked .overview-icon,
+ #dash .dash-item-container .grid-search-result:checked .overview-icon {
- background-color: st-lighten(st-lighten(#3d3d3d, 8%), 7%); }
++ color: #fafafb;
++ background-color: st-lighten(#38383b, 8%); }
+ #dash .dash-item-container .show-apps:checked .overview-icon:hover,
+ #dash .dash-item-container .overview-tile:checked .overview-icon:hover,
+ #dash .dash-item-container .grid-search-result:checked .overview-icon:hover {
- background-color: st-lighten(st-lighten(#3d3d3d, 8%), 9%); }
++ background-color: st-lighten(st-lighten(#38383b, 8%), 7%); }
+ #dash .dash-item-container .show-apps:checked .overview-icon:active,
+ #dash .dash-item-container .overview-tile:checked .overview-icon:active,
+ #dash .dash-item-container .grid-search-result:checked .overview-icon:active {
- background-color: rgba(245, 245, 245, 0.1); }
++ background-color: st-lighten(st-lighten(#38383b, 8%), 9%); }
+ #dash .dash-item-container .app-grid-running-dot {
+ offset-y: -12px; }
+ #dash .dash-separator {
+ width: 1px;
+ margin-left: 4px;
+ margin-right: 4px;
- color: whitesmoke;
- background-color: #282828;
++ background-color: rgba(250, 250, 251, 0.1); }
+ #dash .dash-separator,
+ #dash .dash-background {
+ margin-bottom: 12px; }
+
+.dash-label {
+ -y-offset: 8px; }
+
+/* App Grid */
+.icon-grid {
+ row-spacing: 12px;
+ column-spacing: 12px;
+ max-row-spacing: 36px;
+ max-column-spacing: 36px;
+ page-padding-top: 24px;
+ page-padding-bottom: 24px;
+ page-padding-left: 18px;
+ page-padding-right: 18px; }
+
+/* App Icons */
+.overview-tile, .grid-search-result {
- color: whitesmoke;
- box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.5) !important;
- background-color: st-mix(-st-accent-color, rgba(40, 40, 40, 0.25), 5%); }
++ color: #fafafb;
++ background-color: #222226;
++ background-color: transparent;
+ border-radius: 24px;
+ padding: 12px; }
+ .overview-tile:focus, .grid-search-result:focus {
- background-color: st-mix(-st-accent-color, st-lighten(#282828, 7%), 5%); }
++ color: #fafafb;
++ box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.2) !important;
++ background-color: st-mix(-st-accent-color, rgba(34, 34, 38, 0.25), 5%); }
+ .overview-tile:focus:hover, .grid-search-result:focus:hover {
- color: whitesmoke;
- background-color: st-lighten(#282828, 7%); }
++ background-color: st-mix(-st-accent-color, st-lighten(#222226, 7%), 5%); }
+ .overview-tile:hover, .grid-search-result:hover {
- color: whitesmoke;
- background-color: st-lighten(#282828, 9%); }
++ color: #fafafb;
++ background-color: st-lighten(#222226, 7%); }
+ .overview-tile:active, .grid-search-result:active {
- background-color: st-lighten(st-lighten(#282828, 9%), 7%); }
++ color: #fafafb;
++ background-color: st-lighten(#222226, 9%); }
+ .overview-tile:active:hover, .grid-search-result:active:hover {
- background-color: st-mix(-st-accent-color, st-lighten(#282828, 9%), 5%); }
++ background-color: st-lighten(st-lighten(#222226, 9%), 7%); }
+ .overview-tile:active:focus, .grid-search-result:active:focus {
- color: whitesmoke;
- background-color: st-lighten(#282828, 8%); }
++ background-color: st-mix(-st-accent-color, st-lighten(#222226, 9%), 5%); }
+ .overview-tile:highlighted, .grid-search-result:highlighted, .overview-tile:selected, .grid-search-result:selected, .overview-tile:checked, .grid-search-result:checked {
- background-color: st-lighten(st-lighten(#282828, 8%), 7%); }
++ color: #fafafb;
++ background-color: st-lighten(#222226, 8%); }
+ .overview-tile:highlighted:hover, .grid-search-result:highlighted:hover, .overview-tile:selected:hover, .grid-search-result:selected:hover, .overview-tile:checked:hover, .grid-search-result:checked:hover {
- background-color: st-lighten(st-lighten(#282828, 8%), 9%); }
++ background-color: st-lighten(st-lighten(#222226, 8%), 7%); }
+ .overview-tile:highlighted:active, .grid-search-result:highlighted:active, .overview-tile:selected:active, .grid-search-result:selected:active, .overview-tile:checked:active, .grid-search-result:checked:active {
- color: st-transparentize(whitesmoke, 0.6);
- background-color: #282828; }
++ background-color: st-lighten(st-lighten(#222226, 8%), 9%); }
+ .overview-tile:insensitive, .grid-search-result:insensitive {
- color: whitesmoke;
- background-color: st-mix(whitesmoke, #282828, 12%); }
++ color: st-transparentize(#fafafb, 0.6);
++ background-color: #222226; }
+ .overview-tile:drop, .grid-search-result:drop {
+ background-color: st-transparentize(-st-accent-color, 0.8);
+ box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.2); }
+ .overview-tile .overview-icon.overview-icon-with-label > StBoxLayout, .grid-search-result .overview-icon.overview-icon-with-label > StBoxLayout {
+ spacing: 6px; }
+
+.app-folder {
- color: whitesmoke;
- box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.5) !important;
- background-color: st-mix(-st-accent-color, st-mix(whitesmoke, #282828, 12%), 5%); }
++ color: #fafafb;
++ background-color: st-mix(#fafafb, #222226, 12%); }
+ .app-folder:focus {
- background-color: st-mix(-st-accent-color, st-lighten(st-mix(whitesmoke, #282828, 12%), 4%), 5%); }
++ color: #fafafb;
++ box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.2) !important;
++ background-color: st-mix(-st-accent-color, st-mix(#fafafb, #222226, 12%), 5%); }
+ .app-folder:focus:hover {
- color: whitesmoke;
- background-color: st-lighten(st-mix(whitesmoke, #282828, 12%), 4%); }
++ background-color: st-mix(-st-accent-color, st-lighten(st-mix(#fafafb, #222226, 12%), 4%), 5%); }
+ .app-folder:hover {
- color: whitesmoke;
- background-color: st-lighten(st-mix(whitesmoke, #282828, 12%), 9%); }
++ color: #fafafb;
++ background-color: st-lighten(st-mix(#fafafb, #222226, 12%), 4%); }
+ .app-folder:active {
- background-color: st-lighten(st-lighten(st-mix(whitesmoke, #282828, 12%), 9%), 4%); }
++ color: #fafafb;
++ background-color: st-lighten(st-mix(#fafafb, #222226, 12%), 9%); }
+ .app-folder:active:hover {
- background-color: st-mix(-st-accent-color, st-lighten(st-mix(whitesmoke, #282828, 12%), 9%), 5%); }
++ background-color: st-lighten(st-lighten(st-mix(#fafafb, #222226, 12%), 9%), 4%); }
+ .app-folder:active:focus {
- color: whitesmoke;
- background-color: st-lighten(st-mix(whitesmoke, #282828, 12%), 8%); }
++ background-color: st-mix(-st-accent-color, st-lighten(st-mix(#fafafb, #222226, 12%), 9%), 5%); }
+ .app-folder:highlighted, .app-folder:selected, .app-folder:checked {
- background-color: st-lighten(st-lighten(st-mix(whitesmoke, #282828, 12%), 8%), 4%); }
++ color: #fafafb;
++ background-color: st-lighten(st-mix(#fafafb, #222226, 12%), 8%); }
+ .app-folder:highlighted:hover, .app-folder:selected:hover, .app-folder:checked:hover {
- background-color: st-lighten(st-lighten(st-mix(whitesmoke, #282828, 12%), 8%), 9%); }
++ background-color: st-lighten(st-lighten(st-mix(#fafafb, #222226, 12%), 8%), 4%); }
+ .app-folder:highlighted:active, .app-folder:selected:active, .app-folder:checked:active {
- color: st-transparentize(whitesmoke, 0.6);
- background-color: st-darken(st-mix(whitesmoke, #282828, 12%), 3%); }
++ background-color: st-lighten(st-lighten(st-mix(#fafafb, #222226, 12%), 8%), 9%); }
+ .app-folder:insensitive {
- background-color: whitesmoke;
++ color: st-transparentize(#fafafb, 0.6);
++ background-color: st-darken(st-mix(#fafafb, #222226, 12%), 3%); }
+ .app-folder:drop {
+ background-color: st-transparentize(-st-accent-color, 0.8);
+ box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.2); }
+
+.app-grid-running-dot {
+ height: 5px;
+ width: 5px;
+ border-radius: 5px;
- background-color: #3d3d3d;
- color: whitesmoke;
++ background-color: #fafafb;
+ offset-y: 6px; }
+
+.app-folder-dialog-container {
+ padding-top: 2.2em; }
+
+.app-folder-dialog {
+ width: 720px;
+ height: 720px;
+ border-radius: 64px;
- box-shadow: inset 0 0 0 1px rgba(245, 245, 245, 0.1); }
++ background-color: #38383b;
++ color: #fafafb;
+ padding: 0 1px;
- color: whitesmoke;
- background-color: st-mix(whitesmoke, #3d3d3d, 12%); }
++ box-shadow: inset 0 0 0 1px rgba(250, 250, 251, 0.1); }
+ .app-folder-dialog .folder-name-container {
+ padding: 24px 36px;
+ padding-bottom: 0; }
+ .app-folder-dialog .folder-name-container .folder-name-entry {
+ width: 12em; }
+ .app-folder-dialog .icon-button, .app-folder-dialog .login-dialog-button.cancel-button, .app-folder-dialog .login-dialog-button.switch-user-button, .app-folder-dialog .login-dialog-button.login-dialog-session-list-button, .app-folder-dialog .calendar .calendar-month-header .pager-button, .calendar .calendar-month-header .app-folder-dialog .pager-button, .app-folder-dialog .message .message-header .message-expand-button, .message .message-header .app-folder-dialog .message-expand-button,
+ .app-folder-dialog .message .message-header .message-close-button,
+ .message .message-header .app-folder-dialog .message-close-button, .app-folder-dialog .screenshot-ui-show-pointer-button {
- color: whitesmoke;
- background-color: st-lighten(st-mix(whitesmoke, #3d3d3d, 12%), 4%); }
++ color: #fafafb;
++ background-color: st-mix(#fafafb, #38383b, 12%); }
+ .app-folder-dialog .icon-button:hover, .app-folder-dialog .login-dialog-button.cancel-button:hover, .app-folder-dialog .login-dialog-button.switch-user-button:hover, .app-folder-dialog .login-dialog-button.login-dialog-session-list-button:hover, .app-folder-dialog .calendar .calendar-month-header .pager-button:hover, .calendar .calendar-month-header .app-folder-dialog .pager-button:hover, .app-folder-dialog .message .message-header .message-expand-button:hover, .message .message-header .app-folder-dialog .message-expand-button:hover,
+ .app-folder-dialog .message .message-header .message-close-button:hover,
+ .message .message-header .app-folder-dialog .message-close-button:hover, .app-folder-dialog .screenshot-ui-show-pointer-button:hover {
- color: whitesmoke;
- background-color: st-lighten(st-mix(whitesmoke, #3d3d3d, 12%), 9%); }
++ color: #fafafb;
++ background-color: st-lighten(st-mix(#fafafb, #38383b, 12%), 4%); }
+ .app-folder-dialog .icon-button:active, .app-folder-dialog .login-dialog-button.cancel-button:active, .app-folder-dialog .login-dialog-button.switch-user-button:active, .app-folder-dialog .login-dialog-button.login-dialog-session-list-button:active, .app-folder-dialog .calendar .calendar-month-header .pager-button:active, .calendar .calendar-month-header .app-folder-dialog .pager-button:active, .app-folder-dialog .message .message-header .message-expand-button:active, .message .message-header .app-folder-dialog .message-expand-button:active,
+ .app-folder-dialog .message .message-header .message-close-button:active,
+ .message .message-header .app-folder-dialog .message-close-button:active, .app-folder-dialog .screenshot-ui-show-pointer-button:active {
- background-color: st-lighten(st-lighten(st-mix(whitesmoke, #3d3d3d, 12%), 9%), 4%); }
++ color: #fafafb;
++ background-color: st-lighten(st-mix(#fafafb, #38383b, 12%), 9%); }
+ .app-folder-dialog .icon-button:active:hover, .app-folder-dialog .login-dialog-button.cancel-button:active:hover, .app-folder-dialog .login-dialog-button.switch-user-button:active:hover, .app-folder-dialog .login-dialog-button.login-dialog-session-list-button:active:hover, .app-folder-dialog .calendar .calendar-month-header .pager-button:active:hover, .calendar .calendar-month-header .app-folder-dialog .pager-button:active:hover, .app-folder-dialog .message .message-header .message-expand-button:active:hover, .message .message-header .app-folder-dialog .message-expand-button:active:hover,
+ .app-folder-dialog .message .message-header .message-close-button:active:hover,
+ .message .message-header .app-folder-dialog .message-close-button:active:hover, .app-folder-dialog .screenshot-ui-show-pointer-button:active:hover {
- background-color: st-mix(-st-accent-color, st-lighten(st-mix(whitesmoke, #3d3d3d, 12%), 9%), 5%); }
++ background-color: st-lighten(st-lighten(st-mix(#fafafb, #38383b, 12%), 9%), 4%); }
+ .app-folder-dialog .icon-button:active:focus, .app-folder-dialog .login-dialog-button.cancel-button:active:focus, .app-folder-dialog .login-dialog-button.switch-user-button:active:focus, .app-folder-dialog .login-dialog-button.login-dialog-session-list-button:active:focus, .app-folder-dialog .calendar .calendar-month-header .pager-button:active:focus, .calendar .calendar-month-header .app-folder-dialog .pager-button:active:focus, .app-folder-dialog .message .message-header .message-expand-button:active:focus, .message .message-header .app-folder-dialog .message-expand-button:active:focus,
+ .app-folder-dialog .message .message-header .message-close-button:active:focus,
+ .message .message-header .app-folder-dialog .message-close-button:active:focus, .app-folder-dialog .screenshot-ui-show-pointer-button:active:focus {
- color: whitesmoke;
- background-color: #3d3d3d; }
++ background-color: st-mix(-st-accent-color, st-lighten(st-mix(#fafafb, #38383b, 12%), 9%), 5%); }
+ .app-folder-dialog .page-indicators {
+ margin-bottom: 24px; }
+ .app-folder-dialog .page-navigation-arrow {
- color: whitesmoke;
- background-color: st-lighten(#3d3d3d, 7%); }
++ color: #fafafb;
++ background-color: #38383b; }
+ .app-folder-dialog .page-navigation-arrow:hover {
- color: whitesmoke;
- background-color: st-lighten(#3d3d3d, 9%); }
++ color: #fafafb;
++ background-color: st-lighten(#38383b, 7%); }
+ .app-folder-dialog .page-navigation-arrow:active {
- background-color: st-lighten(st-lighten(#3d3d3d, 9%), 7%); }
++ color: #fafafb;
++ background-color: st-lighten(#38383b, 9%); }
+ .app-folder-dialog .page-navigation-arrow:active:hover {
- background-color: st-mix(-st-accent-color, st-lighten(#3d3d3d, 9%), 5%); }
++ background-color: st-lighten(st-lighten(#38383b, 9%), 7%); }
+ .app-folder-dialog .page-navigation-arrow:active:focus {
- color: whitesmoke;
- background-color: #3d3d3d; }
++ background-color: st-mix(-st-accent-color, st-lighten(#38383b, 9%), 5%); }
+ .app-folder-dialog .overview-tile, .app-folder-dialog .grid-search-result {
- color: whitesmoke;
- box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.5) !important;
- background-color: st-mix(-st-accent-color, rgba(61, 61, 61, 0.25), 5%); }
++ color: #fafafb;
++ background-color: #38383b;
++ background-color: transparent; }
+ .app-folder-dialog .overview-tile:focus, .app-folder-dialog .grid-search-result:focus {
- background-color: st-mix(-st-accent-color, st-lighten(#3d3d3d, 7%), 5%); }
++ color: #fafafb;
++ box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.2) !important;
++ background-color: st-mix(-st-accent-color, rgba(56, 56, 59, 0.25), 5%); }
+ .app-folder-dialog .overview-tile:focus:hover, .app-folder-dialog .grid-search-result:focus:hover {
- color: whitesmoke;
- background-color: st-lighten(#3d3d3d, 7%); }
++ background-color: st-mix(-st-accent-color, st-lighten(#38383b, 7%), 5%); }
+ .app-folder-dialog .overview-tile:hover, .app-folder-dialog .grid-search-result:hover {
- color: whitesmoke;
- background-color: st-lighten(#3d3d3d, 9%); }
++ color: #fafafb;
++ background-color: st-lighten(#38383b, 7%); }
+ .app-folder-dialog .overview-tile:active, .app-folder-dialog .grid-search-result:active {
- background-color: st-lighten(st-lighten(#3d3d3d, 9%), 7%); }
++ color: #fafafb;
++ background-color: st-lighten(#38383b, 9%); }
+ .app-folder-dialog .overview-tile:active:hover, .app-folder-dialog .grid-search-result:active:hover {
- background-color: st-mix(-st-accent-color, st-lighten(#3d3d3d, 9%), 5%); }
++ background-color: st-lighten(st-lighten(#38383b, 9%), 7%); }
+ .app-folder-dialog .overview-tile:active:focus, .app-folder-dialog .grid-search-result:active:focus {
- color: whitesmoke;
- background-color: st-lighten(#3d3d3d, 8%); }
++ background-color: st-mix(-st-accent-color, st-lighten(#38383b, 9%), 5%); }
+ .app-folder-dialog .overview-tile:highlighted, .app-folder-dialog .grid-search-result:highlighted, .app-folder-dialog .overview-tile:selected, .app-folder-dialog .grid-search-result:selected, .app-folder-dialog .overview-tile:checked, .app-folder-dialog .grid-search-result:checked {
- background-color: st-lighten(st-lighten(#3d3d3d, 8%), 7%); }
++ color: #fafafb;
++ background-color: st-lighten(#38383b, 8%); }
+ .app-folder-dialog .overview-tile:highlighted:hover, .app-folder-dialog .grid-search-result:highlighted:hover, .app-folder-dialog .overview-tile:selected:hover, .app-folder-dialog .grid-search-result:selected:hover, .app-folder-dialog .overview-tile:checked:hover, .app-folder-dialog .grid-search-result:checked:hover {
- background-color: st-lighten(st-lighten(#3d3d3d, 8%), 9%); }
++ background-color: st-lighten(st-lighten(#38383b, 8%), 7%); }
+ .app-folder-dialog .overview-tile:highlighted:active, .app-folder-dialog .grid-search-result:highlighted:active, .app-folder-dialog .overview-tile:selected:active, .app-folder-dialog .grid-search-result:selected:active, .app-folder-dialog .overview-tile:checked:active, .app-folder-dialog .grid-search-result:checked:active {
- color: st-transparentize(whitesmoke, 0.6);
- background-color: #3d3d3d; }
++ background-color: st-lighten(st-lighten(#38383b, 8%), 9%); }
+ .app-folder-dialog .overview-tile:insensitive, .app-folder-dialog .grid-search-result:insensitive {
- background-color: whitesmoke;
++ color: st-transparentize(#fafafb, 0.6);
++ background-color: #38383b; }
+ .app-folder-dialog .overview-tile:drop, .app-folder-dialog .grid-search-result:drop {
+ background-color: st-transparentize(-st-accent-color, 0.8);
+ box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.2); }
+
+.rename-folder-popup .rename-folder-popup-item {
+ spacing: 6px; }
+ .rename-folder-popup .rename-folder-popup-item:ltr, .rename-folder-popup .rename-folder-popup-item:rtl {
+ padding: 0 12px; }
+
+.page-indicator {
+ padding: 6px 12px 0;
+ transition-duration: 400ms; }
+ .page-indicator .page-indicator-icon {
+ width: 10px;
+ height: 10px;
+ border-radius: 999px;
- background-color: rgba(245, 245, 245, 0.1);
- color: whitesmoke;
++ background-color: #fafafb;
+ transition-duration: 400ms; }
+
+.apps-scroll-view {
+ padding: 0; }
+
+.system-action-icon {
- color: whitesmoke;
- background-color: #282828; }
++ background-color: rgba(250, 250, 251, 0.1);
++ color: #fafafb;
+ border-radius: 999px;
+ icon-size: 48px; }
+
+.page-navigation-hint.dnd {
+ background: rgba(255, 255, 255, 0.1); }
+
+.page-navigation-hint.next:ltr, .page-navigation-hint.previous:rtl {
+ background-gradient-start: rgba(255, 255, 255, 0.05);
+ background-gradient-end: transparent;
+ background-gradient-direction: horizontal;
+ border-radius: 24px 0px 0px 24px; }
+
+.page-navigation-hint.previous:ltr, .page-navigation-hint.next:rtl {
+ background-gradient-start: transparent;
+ background-gradient-end: rgba(255, 255, 255, 0.05);
+ background-gradient-direction: horizontal;
+ border-radius: 0px 24px 24px 0px; }
+
+.page-navigation-arrow {
+ margin: 6px;
+ padding: 18px;
+ width: 24px;
+ height: 24px;
+ border-radius: 999px;
+ transition-duration: 100ms;
- color: whitesmoke; }
++ color: #fafafb;
++ background-color: #222226; }
+ .page-navigation-arrow > StIcon {
- color: whitesmoke;
- background-color: st-lighten(#282828, 7%); }
++ color: #fafafb; }
+ .page-navigation-arrow:hover {
- color: whitesmoke;
- background-color: st-lighten(#282828, 9%); }
++ color: #fafafb;
++ background-color: st-lighten(#222226, 7%); }
+ .page-navigation-arrow:active {
- background-color: st-lighten(st-lighten(#282828, 9%), 7%); }
++ color: #fafafb;
++ background-color: st-lighten(#222226, 9%); }
+ .page-navigation-arrow:active:hover {
- background-color: st-mix(-st-accent-color, st-lighten(#282828, 9%), 5%); }
++ background-color: st-lighten(st-lighten(#222226, 9%), 7%); }
+ .page-navigation-arrow:active:focus {
- color: whitesmoke;
- background-color: #4e4e4e;
++ background-color: st-mix(-st-accent-color, st-lighten(#222226, 9%), 5%); }
+
+/* Workspace pager */
+.workspace-thumbnails {
+ visible-width: 32px;
+ spacing: 6px;
+ padding: 6px; }
+ .workspace-thumbnails .workspace-thumbnail {
- background-color: rgba(255, 255, 255, 0.05);
- color: #ffffff; }
++ color: #fafafb;
++ background-color: #46464e;
+ border-radius: 4px;
+ border: 1px solid transparent; }
+ .workspace-thumbnails .placeholder {
+ background-image: url("resource:///org/gnome/shell/theme/workspace-placeholder.svg");
+ background-size: contain;
+ width: 18px; }
+
+.workspace-thumbnail-indicator {
+ border: 3px solid -st-accent-color;
+ border-radius: 8px; }
+
+.ripple-pointer-location {
+ width: 50px;
+ height: 50px;
+ border-radius: 25px;
+ background-color: st-lighten(st-transparentize(-st-accent-color, 0.7), 30%);
+ box-shadow: 0 0 2px 2px st-lighten(-st-accent-color, 20%); }
+
+.pie-timer {
+ width: 60px;
+ height: 60px;
+ -pie-border-width: 3px;
+ -pie-border-color: -st-accent-color;
+ -pie-background-color: st-lighten(st-transparentize(-st-accent-color, 0.7), 40%); }
+
+.magnifier-zoom-region {
+ border: 2px solid -st-accent-color; }
+ .magnifier-zoom-region.full-screen {
+ border-width: 0; }
+
+.select-area-rubberband {
+ background-color: st-transparentize(-st-accent-color, 0.7);
+ border: 1px solid -st-accent-color; }
+
+.user-icon {
+ background-size: contain;
+ border-radius: 999px;
+ icon-size: 64px;
- box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.1); }
++ background-color: rgba(34, 34, 38, 0.05);
++ color: #222226; }
+ .user-icon StIcon {
+ padding: 12px; }
+ .user-icon.user-avatar {
- color: #f5c211; }
++ box-shadow: inset 0 0 0 1px rgba(34, 34, 38, 0.1); }
+
+.lightbox {
+ background-color: black; }
+
+.flashspot {
+ background-color: white; }
+
+.hidden {
+ color: transparent; }
+
+.caps-lock-warning-label {
+ text-align: center;
+ padding-bottom: 8px;
- background-color: #353535; }
++ color: #e5a50a; }
+
+/* Workspace animation */
+.workspace-animation {
- background-color: #353535;
++ background-color: #2e2e33; }
+
+/* Tiled window previews */
+.tile-preview {
+ background-color: st-transparentize(-st-accent-color, 0.5);
+ border: 1px solid -st-accent-color; }
+
+/* On-screen Keyboard */
+#keyboard {
- min-height: 1.2em;
- min-width: 1.2em;
- border-width: 1px;
- border-style: solid;
- border-radius: 10px;
++ background-color: #2e2e33;
+ box-shadow: inset 0 1px 0 0 rgba(255, 255, 255, 0.02); }
+ #keyboard .page-indicator {
+ padding: 6px; }
+ #keyboard .page-indicator .page-indicator-icon {
+ width: 8px;
+ height: 8px; }
+
+.key-container {
+ padding: 4px;
+ spacing: 4px; }
+
+.keyboard-key {
+ font-size: 1.455em;
+ font-weight: bold;
- color: #282828;
- box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.5) !important;
- background-color: st-mix(-st-accent-color, st-mix(#282828, whitesmoke, 12%), 5%); }
++ border-radius: 0.546em;
+ box-shadow: 0 1px 0 0 rgba(0, 0, 0, 0.05);
+ color: #ffffff;
+ background-color: st-mix(#ffffff, #4d4d4d, 12%); }
+ .keyboard-key:focus {
- background-color: st-mix(-st-accent-color, st-darken(st-mix(#282828, whitesmoke, 12%), 4%), 5%); }
++ color: #222226;
++ box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.2) !important;
++ background-color: st-mix(-st-accent-color, st-mix(#222226, #fafafb, 12%), 5%); }
+ .keyboard-key:focus:hover {
- .keyboard-key:grayed {
- background-color: #ededed;
- color: #ffffff;
- border-color: rgba(255, 255, 255, 0.1); }
++ background-color: st-mix(-st-accent-color, st-darken(st-mix(#222226, #fafafb, 12%), 4%), 5%); }
+ .keyboard-key:hover {
+ color: #ffffff;
+ background-color: st-darken(st-mix(#ffffff, #4d4d4d, 12%), 4%); }
+ .keyboard-key:active {
+ color: #ffffff;
+ background-color: st-darken(st-mix(#ffffff, #4d4d4d, 12%), 9%); }
+ .keyboard-key:active:hover {
+ background-color: st-darken(st-darken(st-mix(#ffffff, #4d4d4d, 12%), 9%), 4%); }
+ .keyboard-key:active:focus {
+ background-color: st-mix(-st-accent-color, st-darken(st-mix(#ffffff, #4d4d4d, 12%), 9%), 5%); }
+ .keyboard-key:checked {
+ color: #ffffff;
+ background-color: st-darken(st-mix(#ffffff, #4d4d4d, 12%), 8%); }
+ .keyboard-key:checked:hover {
+ background-color: st-darken(st-darken(st-mix(#ffffff, #4d4d4d, 12%), 8%), 4%); }
+ .keyboard-key:checked:active {
+ background-color: st-darken(st-darken(st-mix(#ffffff, #4d4d4d, 12%), 8%), 9%); }
- border-radius: 10px; }
+ .keyboard-key.default-key {
+ color: #ffffff;
+ background-color: st-mix(#ffffff, #303030, 12%);
- border-color: st-lighten(-st-accent-color, 5%);
++ border: none; }
+ .keyboard-key.default-key:hover {
+ color: #ffffff;
+ background-color: st-darken(st-mix(#ffffff, #303030, 12%), 4%); }
+ .keyboard-key.default-key:active {
+ color: #ffffff;
+ background-color: st-darken(st-mix(#ffffff, #303030, 12%), 9%); }
+ .keyboard-key.default-key:active:hover {
+ background-color: st-darken(st-darken(st-mix(#ffffff, #303030, 12%), 9%), 4%); }
+ .keyboard-key.default-key:active:focus {
+ background-color: st-mix(-st-accent-color, st-darken(st-mix(#ffffff, #303030, 12%), 9%), 5%); }
+ .keyboard-key.default-key:checked {
+ color: #ffffff;
+ background-color: st-darken(st-mix(#ffffff, #303030, 12%), 8%); }
+ .keyboard-key.default-key:checked:hover {
+ background-color: st-darken(st-darken(st-mix(#ffffff, #303030, 12%), 8%), 4%); }
+ .keyboard-key.default-key:checked:active {
+ background-color: st-darken(st-darken(st-mix(#ffffff, #303030, 12%), 8%), 9%); }
+ .keyboard-key.default-key:latched {
- .keyboard-key.enter-key {
- color: -st-accent-fg-color;
- background-color: st-mix(-st-accent-fg-color, -st-accent-color, 12%);
- border-radius: 10px;
- color: #ffffff; }
- .keyboard-key.enter-key:hover {
- color: -st-accent-fg-color;
- background-color: st-darken(st-mix(-st-accent-fg-color, -st-accent-color, 12%), 4%); }
- .keyboard-key.enter-key:active {
- color: -st-accent-fg-color;
- background-color: st-darken(st-mix(-st-accent-fg-color, -st-accent-color, 12%), 9%); }
- .keyboard-key.enter-key:active:hover {
- background-color: st-darken(st-darken(st-mix(-st-accent-fg-color, -st-accent-color, 12%), 9%), 4%); }
- .keyboard-key.enter-key:active:focus {
- background-color: st-mix(-st-accent-color, st-darken(st-mix(-st-accent-fg-color, -st-accent-color, 12%), 9%), 5%); }
- .keyboard-key.enter-key:checked {
- color: -st-accent-fg-color;
- background-color: st-darken(st-mix(-st-accent-fg-color, -st-accent-color, 12%), 8%); }
- .keyboard-key.enter-key:checked:hover {
- background-color: st-darken(st-darken(st-mix(-st-accent-fg-color, -st-accent-color, 12%), 8%), 4%); }
- .keyboard-key.enter-key:checked:active {
- background-color: st-darken(st-darken(st-mix(-st-accent-fg-color, -st-accent-color, 12%), 8%), 9%); }
- .keyboard-key.shift-key-uppercase {
- background-color: gray;
- color: #353535; }
- .keyboard-key.shift-key-uppercase:hover {
- background-color: #8c8c8c;
- color: #424242; }
+ background-color: -st-accent-color; }
- icon-size: 24px; }
+ .keyboard-key StIcon {
- .keyboard-subkeys {
- -arrow-border-radius: 16px;
- -arrow-background-color: #353535;
++ icon-size: 1.6365em; }
+
- -arrow-border-color: #4c4c4c;
++.keyboard-subkeys-boxpointer {
++ -arrow-border-radius: 22px;
++ -arrow-background-color: #2e2e33;
+ -arrow-border-width: 1px;
- -boxpointer-gap: 6px;
- padding: 6px; }
- .keyboard-subkeys .keyboard-key {
- color: #ffffff;
- background-color: st-mix(#ffffff, #4d4d4d, 12%);
- border-radius: 10px; }
- .keyboard-subkeys .keyboard-key:focus {
- color: #282828;
- box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.5) !important;
- background-color: st-mix(-st-accent-color, st-mix(#282828, whitesmoke, 12%), 5%); }
- .keyboard-subkeys .keyboard-key:focus:hover {
- background-color: st-mix(-st-accent-color, st-darken(st-mix(#282828, whitesmoke, 12%), 4%), 5%); }
- .keyboard-subkeys .keyboard-key:hover {
- color: #ffffff;
- background-color: st-darken(st-mix(#ffffff, #4d4d4d, 12%), 4%); }
- .keyboard-subkeys .keyboard-key:active {
- color: #ffffff;
- background-color: st-darken(st-mix(#ffffff, #4d4d4d, 12%), 9%); }
- .keyboard-subkeys .keyboard-key:active:hover {
- background-color: st-darken(st-darken(st-mix(#ffffff, #4d4d4d, 12%), 9%), 4%); }
- .keyboard-subkeys .keyboard-key:active:focus {
- background-color: st-mix(-st-accent-color, st-darken(st-mix(#ffffff, #4d4d4d, 12%), 9%), 5%); }
- .keyboard-subkeys .keyboard-key:checked {
- color: #ffffff;
- background-color: st-darken(st-mix(#ffffff, #4d4d4d, 12%), 8%); }
- .keyboard-subkeys .keyboard-key:checked:hover {
- background-color: st-darken(st-darken(st-mix(#ffffff, #4d4d4d, 12%), 8%), 4%); }
- .keyboard-subkeys .keyboard-key:checked:active {
- background-color: st-darken(st-darken(st-mix(#ffffff, #4d4d4d, 12%), 8%), 9%); }
++ -arrow-border-color: #44444c;
+ -arrow-base: 20px;
+ -arrow-rise: 10px;
- padding: 0px 18px;
++ -boxpointer-gap: 4px;
++ border-radius: 22px;
++ box-shadow: 0 0 12px 0 rgba(0, 0, 0, 0.1); }
++ .keyboard-subkeys-boxpointer .key-container {
++ padding: 12px;
++ spacing: 8px; }
+
+.emoji-page .keyboard-key {
+ background-color: transparent;
+ border: none;
+ color: initial; }
+
+.emoji-panel .keyboard-key:latched {
+ border-color: st-lighten(-st-accent-color, 5%);
+ background-color: -st-accent-color; }
+
+.word-suggestions {
+ spacing: 12px;
+ min-height: 17pt;
+ padding: 12px;
+ color: #ffffff; }
+ .word-suggestions StButton {
+ margin: 0 3px;
+ min-width: 32px;
+ border-radius: 4px;
- color: #282828;
- box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.5) !important;
- background-color: st-mix(-st-accent-color, st-mix(#282828, whitesmoke, 12%), 5%); }
++ padding: 6px 18px;
+ background-color: transparent;
+ border-color: transparent;
+ box-shadow: none; }
+ .word-suggestions StButton:insensitive {
+ background-color: transparent !important; }
+ .word-suggestions StButton:focus {
- background-color: st-mix(-st-accent-color, st-darken(st-mix(#282828, whitesmoke, 12%), 4%), 5%); }
++ color: #222226;
++ box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.2) !important;
++ background-color: st-mix(-st-accent-color, st-mix(#222226, #fafafb, 12%), 5%); }
+ .word-suggestions StButton:focus:hover {
- background-color: rgba(53, 53, 53, 0.98);
++ background-color: st-mix(-st-accent-color, st-darken(st-mix(#222226, #fafafb, 12%), 4%), 5%); }
+ .word-suggestions StButton:hover {
+ color: #ffffff;
+ background-color: st-darken(st-mix(#ffffff, #4d4d4d, 12%), 4%); }
+ .word-suggestions StButton:active {
+ color: #ffffff;
+ background-color: st-darken(st-mix(#ffffff, #4d4d4d, 12%), 9%); }
+ .word-suggestions StButton:active:hover {
+ background-color: st-darken(st-darken(st-mix(#ffffff, #4d4d4d, 12%), 9%), 4%); }
+ .word-suggestions StButton:active:focus {
+ background-color: st-mix(-st-accent-color, st-darken(st-mix(#ffffff, #4d4d4d, 12%), 9%), 5%); }
+ .word-suggestions StButton:checked {
+ color: #ffffff;
+ background-color: st-darken(st-mix(#ffffff, #4d4d4d, 12%), 8%); }
+ .word-suggestions StButton:checked:hover {
+ background-color: st-darken(st-darken(st-mix(#ffffff, #4d4d4d, 12%), 8%), 4%); }
+ .word-suggestions StButton:checked:active {
+ background-color: st-darken(st-darken(st-mix(#ffffff, #4d4d4d, 12%), 8%), 9%); }
+
+/* Looking Glass */
+.lg-dialog StEntry {
+ min-height: 1.5em; }
+
+.lg-dialog .shell-link {
+ color: st-lighten(-st-accent-color, 20%); }
+ .lg-dialog .shell-link:hover {
+ color: st-lighten(st-lighten(-st-accent-color, 20%), 10%); }
+ .lg-dialog .shell-link:active {
+ color: st-darken(st-lighten(-st-accent-color, 20%), 10%); }
+
+.lg-dialog .actor-link {
+ color: st-darken(#ffffff, 20%); }
+ .lg-dialog .actor-link:hover {
+ color: #ffffff; }
+ .lg-dialog .actor-link:active {
+ color: st-lighten(#ffffff, 20%); }
+ .lg-dialog .actor-link StIcon {
+ icon-size: 12px; }
+
+.lg-completions-text {
+ font-style: italic; }
+
+#LookingGlassDialog {
- background-color: st-lighten(st-mix(#ffffff, #353535, 12%), 9%); }
++ background-color: rgba(46, 46, 51, 0.98);
+ color: #ffffff;
+ border-radius: 16px;
+ margin-top: 4px;
+ border: 2px solid transparent;
+ padding: 6px;
+ spacing: 6px;
+ box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.05); }
+ #LookingGlassDialog > #Toolbar {
+ border: none;
+ padding: 6px;
+ border-radius: 0;
+ background-color: transparent;
+ spacing: 6px; }
+ #LookingGlassDialog > #Toolbar .lg-toolbar-button {
+ padding: 6px 12px; }
+ #LookingGlassDialog > #Toolbar .lg-toolbar-button > StIcon {
+ icon-size: 16px; }
+ #LookingGlassDialog .labels {
+ spacing: 6px; }
+ #LookingGlassDialog .notebook-tab {
+ background-color: transparent;
+ -natural-hpadding: 12px;
+ -minimum-hpadding: 12px;
+ padding: 6px 12px; }
+ #LookingGlassDialog .notebook-tab:selected {
+ color: #ffffff;
- background-color: st-lighten(st-lighten(st-mix(#ffffff, #353535, 12%), 9%), 4%); }
++ background-color: st-lighten(st-mix(#ffffff, #2e2e33, 12%), 9%); }
+ #LookingGlassDialog .notebook-tab:selected:hover {
- background-color: st-mix(-st-accent-color, st-lighten(st-mix(#ffffff, #353535, 12%), 9%), 5%); }
++ background-color: st-lighten(st-lighten(st-mix(#ffffff, #2e2e33, 12%), 9%), 4%); }
+ #LookingGlassDialog .notebook-tab:selected:focus {
- background-color: #353535;
++ background-color: st-mix(-st-accent-color, st-lighten(st-mix(#ffffff, #2e2e33, 12%), 9%), 5%); }
+
+#LookingGlassPropertyInspector {
- background-color: st-mix(#ffffff, #353535, 12%);
++ background-color: #2e2e33;
+ color: #ffffff;
+ border-radius: 16px;
+ border: 1px solid rgba(255, 255, 255, 0.1);
+ padding: 12px; }
+ #LookingGlassPropertyInspector .lg-obj-inspector-title {
+ spacing: 4px; }
+ #LookingGlassPropertyInspector .lg-obj-inspector-close-button,
+ #LookingGlassPropertyInspector .lg-obj-inspector-button {
+ padding: 6px 12px; }
+ #LookingGlassPropertyInspector .lg-obj-inspector-close-button {
+ margin: 4px;
+ padding: 6px;
+ border-radius: 999px; }
+ #LookingGlassPropertyInspector .lg-obj-inspector-close-button > StIcon {
+ icon-size: 16px; }
+
+#LookingGlassEvaluator {
+ padding: 6px; }
+ #LookingGlassEvaluator .evaluator-results {
+ spacing: 6px; }
+
+#LookingGlassWindows {
+ padding: 6px;
+ spacing: 6px; }
+ #LookingGlassWindows .lg-window {
+ color: #ffffff;
- background-color: st-mix(#ffffff, #353535, 12%);
++ background-color: st-mix(#ffffff, #2e2e33, 12%);
+ margin: 0;
+ padding: 12px; }
+
+#LookingGlassExtensions .lg-extensions-list {
+ padding: 6px;
+ spacing: 6px; }
+
+#LookingGlassExtensions .lg-extension {
+ color: #ffffff;
- color: whitesmoke; }
++ background-color: st-mix(#ffffff, #2e2e33, 12%);
+ margin: 0;
+ spacing: 4px;
+ padding: 12px; }
+ #LookingGlassExtensions .lg-extension .lg-extension-name {
+ color: #ffffff !important; }
+ #LookingGlassExtensions .lg-extension .lg-extension-meta {
+ spacing: 12px; }
+
+#LookingGlassExtensions .lg-extensions-none {
+ color: rgba(255, 255, 255, 0.5); }
+
+#LookingGlassActors {
+ padding: 6px;
+ spacing: 4px; }
+
+#LookingGlassDebugFlags .lg-debug-flags-header {
+ padding: 6px;
+ padding-top: 12px; }
+
+#LookingGlassDebugFlags .lg-debug-flag-button {
+ padding: 9px 12px;
+ margin-bottom: 6px; }
+ #LookingGlassDebugFlags .lg-debug-flag-button StLabel {
+ font-weight: normal !important; }
+ #LookingGlassDebugFlags .lg-debug-flag-button .toggle-switch {
+ background: rgba(255, 255, 255, 0.15); }
+ #LookingGlassDebugFlags .lg-debug-flag-button .toggle-switch:hover {
+ background: rgba(255, 255, 255, 0.2); }
+ #LookingGlassDebugFlags .lg-debug-flag-button .toggle-switch:checked {
+ background: -st-accent-color;
+ color: -st-accent-fg-color; }
+ #LookingGlassDebugFlags .lg-debug-flag-button .toggle-switch:checked:hover {
+ background-color: st-lighten(-st-accent-color, 5%);
+ color: st-lighten(-st-accent-fg-color, 5%); }
+
+.login-dialog,
+.unlock-dialog {
- color: whitesmoke; }
++ color: #fafafb; }
+ .login-dialog .caps-lock-warning-label,
+ .login-dialog .login-dialog-message-warning,
+ .unlock-dialog .caps-lock-warning-label,
+ .unlock-dialog .login-dialog-message-warning {
- color: #f5c211; }
++ color: #fafafb; }
+ .login-dialog .login-dialog-prompt-layout,
+ .unlock-dialog .login-dialog-prompt-layout {
+ width: 25em;
+ spacing: 9px; }
+
+.login-dialog-button.cancel-button {
+ padding: 9px; }
+
+.login-dialog-button-box {
+ spacing: 12px; }
+
+.conflicting-session-dialog-content {
+ spacing: 20px; }
+ .conflicting-session-dialog-content .conflicting-session-dialog-title {
+ text-align: center;
+ margin-bottom: 5px; }
+ .conflicting-session-dialog-content .conflicting-session-dialog-desc {
+ text-align: center; }
+ .conflicting-session-dialog-content .conflicting-session-dialog-desc-warning {
+ text-align: center;
- color: gainsboro; }
++ color: #e5a50a; }
+
+.login-dialog-logo-bin {
+ margin: 3em 0; }
+
+.login-dialog-banner-view {
+ max-width: 25em; }
+ .login-dialog-banner-view .login-dialog-banner {
- color: gainsboro;
++ color: #dedee4; }
+
+.login-dialog-message {
+ text-align: center; }
+
+.login-dialog-message-hint, .login-dialog-message {
- color: whitesmoke;
- background-color: #282828;
++ color: #dedee4;
+ min-height: 2.75em; }
+
+.login-dialog-user-selection-box {
+ padding-top: 4em;
+ padding-bottom: 8em; }
+
+.login-dialog-not-listed-label {
+ padding: 6px; }
+
+.login-dialog-not-listed-button {
- color: whitesmoke;
- box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.5) !important;
- background-color: st-mix(-st-accent-color, rgba(40, 40, 40, 0.25), 5%); }
++ color: #fafafb;
++ background-color: #222226;
+ padding: 0 6px;
+ margin: 6px; }
+ .login-dialog-not-listed-button:focus {
- background-color: st-mix(-st-accent-color, st-lighten(#282828, 7%), 5%); }
++ color: #fafafb;
++ box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.2) !important;
++ background-color: st-mix(-st-accent-color, rgba(34, 34, 38, 0.25), 5%); }
+ .login-dialog-not-listed-button:focus:hover {
- color: whitesmoke;
- background-color: st-lighten(#282828, 7%); }
++ background-color: st-mix(-st-accent-color, st-lighten(#222226, 7%), 5%); }
+ .login-dialog-not-listed-button:hover {
- color: whitesmoke;
- background-color: st-lighten(#282828, 9%); }
++ color: #fafafb;
++ background-color: st-lighten(#222226, 7%); }
+ .login-dialog-not-listed-button:active {
- background-color: st-lighten(st-lighten(#282828, 9%), 7%); }
++ color: #fafafb;
++ background-color: st-lighten(#222226, 9%); }
+ .login-dialog-not-listed-button:active:hover {
- background-color: st-mix(-st-accent-color, st-lighten(#282828, 9%), 5%); }
++ background-color: st-lighten(st-lighten(#222226, 9%), 7%); }
+ .login-dialog-not-listed-button:active:focus {
- color: darkgray; }
++ background-color: st-mix(-st-accent-color, st-lighten(#222226, 9%), 5%); }
+
+.login-dialog-auth-list-view {
+ -st-vfade-offset: 3em; }
+
+.login-dialog-auth-list {
+ spacing: 6px;
+ margin-left: 2em; }
+
+.login-dialog-auth-list-title {
+ margin-left: 2em; }
+
+.login-dialog-auth-list-item {
+ border-radius: 16px;
+ padding: 4px;
- color: whitesmoke;
- background-color: st-mix(whitesmoke, #282828, 12%);
++ color: #a5a5b7; }
+ .login-dialog-auth-list-item:focus, .login-dialog-auth-list-item:selected {
+ background-color: -st-accent-color;
+ color: -st-accent-fg-color; }
+
+.login-dialog-auth-list-label:ltr {
+ padding-left: 15px;
+ text-align: left; }
+
+.login-dialog-auth-list-label:rtl {
+ padding-right: 15px;
+ text-align: right; }
+
+.login-dialog-user-list-view {
+ width: 25em;
+ -st-vfade-offset: 3em; }
+ .login-dialog-user-list-view .login-dialog-user-list {
+ margin: 0 8px;
+ spacing: 12px; }
+ .login-dialog-user-list-view .login-dialog-user-list .login-dialog-user-list-item {
- color: whitesmoke;
- box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.5) !important;
- background-color: st-mix(-st-accent-color, st-mix(whitesmoke, #282828, 12%), 5%); }
++ color: #fafafb;
++ background-color: st-mix(#fafafb, #222226, 12%);
+ border-radius: 16px;
+ padding: 9px; }
+ .login-dialog-user-list-view .login-dialog-user-list .login-dialog-user-list-item:selected, .login-dialog-user-list-view .login-dialog-user-list .login-dialog-user-list-item:focus {
- background-color: st-mix(-st-accent-color, st-lighten(st-mix(whitesmoke, #282828, 12%), 4%), 5%); }
++ color: #fafafb;
++ box-shadow: inset 0 0 0 2px st-transparentize(-st-accent-color, 0.2) !important;
++ background-color: st-mix(-st-accent-color, st-mix(#fafafb, #222226, 12%), 5%); }
+ .login-dialog-user-list-view .login-dialog-user-list .login-dialog-user-list-item:selected:hover, .login-dialog-user-list-view .login-dialog-user-list .login-dialog-user-list-item:focus:hover {
- color: whitesmoke;
- background-color: st-lighten(st-mix(whitesmoke, #282828, 12%), 4%); }
++ background-color: st-mix(-st-accent-color, st-lighten(st-mix(#fafafb, #222226, 12%), 4%), 5%); }
+ .login-dialog-user-list-view .login-dialog-user-list .login-dialog-user-list-item:hover {
- color: whitesmoke;
- background-color: st-lighten(st-mix(whitesmoke, #282828, 12%), 9%); }
++ color: #fafafb;
++ background-color: st-lighten(st-mix(#fafafb, #222226, 12%), 4%); }
+ .login-dialog-user-list-view .login-dialog-user-list .login-dialog-user-list-item:active {
- background-color: st-lighten(st-lighten(st-mix(whitesmoke, #282828, 12%), 9%), 4%); }
++ color: #fafafb;
++ background-color: st-lighten(st-mix(#fafafb, #222226, 12%), 9%); }
+ .login-dialog-user-list-view .login-dialog-user-list .login-dialog-user-list-item:active:hover {
- background-color: st-mix(-st-accent-color, st-lighten(st-mix(whitesmoke, #282828, 12%), 9%), 5%); }
++ background-color: st-lighten(st-lighten(st-mix(#fafafb, #222226, 12%), 9%), 4%); }
+ .login-dialog-user-list-view .login-dialog-user-list .login-dialog-user-list-item:active:focus {
- background-color: rgba(245, 245, 245, 0.7); }
++ background-color: st-mix(-st-accent-color, st-lighten(st-mix(#fafafb, #222226, 12%), 9%), 5%); }
+ .login-dialog-user-list-view .login-dialog-user-list .login-dialog-user-list-item .user-icon {
+ border: 2px solid transparent; }
+ .login-dialog-user-list-view .login-dialog-user-list .login-dialog-user-list-item .login-dialog-timed-login-indicator {
+ height: 2px;
+ margin-top: 6px;
- background-color: #282828; }
++ background-color: rgba(250, 250, 251, 0.7); }
+ .login-dialog-user-list-view .login-dialog-user-list .login-dialog-user-list-item:logged-in .user-icon {
+ border-color: -st-accent-color; }
+ .login-dialog-user-list-view .login-dialog-user-list .login-dialog-user-list-item:logged-in .user-icon StIcon {
+ background-color: st-transparentize(-st-accent-color, 0.7); }
+
+.unlock-dialog {
+ background-color: transparent; }
+
+.screen-shield-background {
+ background: black;
+ box-shadow: 0 2px 4px rgba(0, 0, 0, 0.6); }
+
+#lockDialogGroup {
- color: whitesmoke;
++ background-color: #222226; }
+
+.unlock-dialog-clock {
- background-color: rgba(245, 245, 245, 0.3); }
++ color: #fafafb;
+ spacing: 2em; }
+ .unlock-dialog-clock .unlock-dialog-clock-time {
+ font-size: 6.546em;
+ font-weight: 800; }
+ .unlock-dialog-clock .unlock-dialog-clock-date {
+ font-weight: 400; }
+ .unlock-dialog-clock .unlock-dialog-clock-hint {
+ margin-top: 2em;
+ padding: 6px 18px;
+ border-radius: 16px;
+ font-weight: bold; }
+
+#unlockDialogNotifications StButton#vhandle, #unlockDialogNotifications StButton#hhandle {
- background-color: rgba(245, 245, 245, 0.5); }
++ background-color: rgba(250, 250, 251, 0.3); }
+ #unlockDialogNotifications StButton#vhandle:hover, #unlockDialogNotifications StButton#vhandle:focus, #unlockDialogNotifications StButton#hhandle:hover, #unlockDialogNotifications StButton#hhandle:focus {
- background-color: rgba(245, 245, 245, 0.1);
- color: whitesmoke;
++ background-color: rgba(250, 250, 251, 0.5); }
+ #unlockDialogNotifications StButton#vhandle:active, #unlockDialogNotifications StButton#hhandle:active {
+ background-color: st-transparentize(-st-accent-color, 0.5); }
+
+.unlock-dialog-notifications-container {
+ margin: 12px;
+ spacing: 6px;
+ width: 25em;
+ background-color: transparent; }
+ .unlock-dialog-notifications-container .summary-notification-stack-scrollview {
+ padding-top: 0;
+ padding-bottom: 0; }
+ .unlock-dialog-notifications-container .notification,
+ .unlock-dialog-notifications-container .unlock-dialog-notification-source {
+ padding: 12px 16px;
+ border: none;
- background-color: rgba(245, 245, 245, 0.2); }
++ background-color: rgba(250, 250, 251, 0.1);
++ color: #fafafb;
+ border-radius: 16px; }
+ .unlock-dialog-notifications-container .notification.critical,
+ .unlock-dialog-notifications-container .unlock-dialog-notification-source.critical {
- color: whitesmoke;
- background-color: rgba(245, 245, 245, 0.1);
++ background-color: rgba(250, 250, 251, 0.2); }
+
+.unlock-dialog-notification-icon {
+ icon-size: 32px; }
+
+.unlock-dialog-notification-label {
+ padding-left: 12px;
+ padding-right: 0; }
+ .unlock-dialog-notification-label:rtl {
+ padding-right: 12px;
+ padding-left: 0; }
+
+.unlock-dialog-notification-count-text {
+ font-weight: bold;
+ padding: 0 12px;
- color: whitesmoke; }
++ color: #fafafb;
++ background-color: rgba(250, 250, 251, 0.1);
+ border-radius: 999px; }
+
+.login-dialog .user-widget .user-widget-label,
+.unlock-dialog .user-widget .user-widget-label {
- background-color: rgba(245, 245, 245, 0.13);
- color: whitesmoke; }
++ color: #fafafb; }
+
+.login-dialog .user-widget .user-icon,
+.unlock-dialog .user-widget .user-icon {
++ background-color: rgba(250, 250, 251, 0.13);
++ color: #fafafb; }
+
+.login-dialog .user-widget.horizontal,
+.unlock-dialog .user-widget.horizontal {
+ spacing: 18px; }
+
+.login-dialog .user-widget.vertical,
+.unlock-dialog .user-widget.vertical {
+ spacing: 24px; }
+ .login-dialog .user-widget.vertical .user-widget-label,
+ .unlock-dialog .user-widget.vertical .user-widget-label {
+ font-weight: 400;
+ font-size: 1.818em;
+ text-align: center;
+ margin-bottom: .75em; }
+ .login-dialog .user-widget.vertical .user-icon,
+ .unlock-dialog .user-widget.vertical .user-icon {
+ icon-size: 160px; }
+ .login-dialog .user-widget.vertical .user-icon StIcon,
+ .unlock-dialog .user-widget.vertical .user-icon StIcon {
+ padding: 30px; }
--- /dev/null
+# Release Notes
+
++## 3.10.1 - July 14, 2024
++
++- The internal copy of the Jasmine library has been updaetd to version 3.10.1, which brings:
++ - Support for async before/it/after functions (2.7.0)
++ - Add `nothing()` matcher (2.8.0)
++ - Add `jasmine.arrayWithExactContents()` tester (2.8.0)
++ - Support for `jasmine.any(Symbol)` (2.9.0)
++ - `jasmine.any(Object)` no longer matches null (3.0)
++ - Add `jasmine.truthy()`, `jasmine.falsy()`, `jasmine.empty()`, and `jasmine.notEmpty()` testers (3.1.0)
++ - Add `spyOnAllFunctions()` (3.2.0)
++ - Add `expectAsync()`, and `toBeResolved()` and `toBeRejected()` matchers (3.2.0)
++ - Add `withContext()` for extra debugging information (3.3.0)
++ - Add `toBeRejectedWith()` matcher (3.3.0)
++ - Support for custom async matchers with `jasmine.addAsyncMatchers()` (3.5.0)
++ - Add `jasmine.setDefaultSpyStrategy()` (3.5.0)
++ - Add `jasmine.mapContaining()` and `jasmine.setContaining()` tester (3.5.0)
++ - Add `toBeTrue()` and `toBeFalse()` matchers (3.5.0)
++ - Add `toHaveBeenCalledOnceWith()` matcher (3.6.0)
++ - Add `toHaveSize()` matcher (3.6.0)
++ - Add `toBePending()` matcher (3.6.0)
++ - Add `already` property of async specs (3.8.0)
++ - Add `spy.calls.thisFor()` (3.8.0)
++ - Add `jasmine.stringContaining()` tester (3.10.0)
++ - All other bug fixes and improvements contained in the intervening versions; see Jasmine's release notes
++- It is now possible to use Jasmine GJS as a Meson subproject.
++- Jasmine GJS now depends on GJS 1.68.0.
++- Thanks to Florian Müllner and Martín Abente Lahaye for contributing.
++
+## 2.6.4 - September 13, 2020
+
+- The internal copy of the Jasmine library has been updated to version 2.6.4, which brings:
+ - Add `toBeNegativeInfinity()`, `toBePositiveInfinity()`, `toHaveBeenCalledBefore()` matchers
+ - Add `spyOnProperty()` for get/set accessors
+ - Add support for ES6 sets to `toContain()` and `toEqual()`
+ - Bug fixes included in 2.6.0, 2.6.1, 2.6.2, 2.6.3 and 2.6.4
+- Thanks to Andy Holmes for contributing.
+
+## 2.5.2 - September 10, 2020
+
+- The internal copy of the Jasmine library has been updated to version 2.5.2, which brings:
+ - Add `toBeGreaterThanOrEqual()` and `toBeLessThanOrEqual()` matchers
+ - Bug fixes included in 2.5.0, 2.5.1 and 2.5.2
+- Thanks to Andy Holmes for contributing.
+
+## 2.4.1 - Sepetember 4, 2020
+
+- The internal copy of the Jasmine library has been updated to version 2.4.1, which brings:
+ - Run jasmine's specs in random order
+ - Add support for returning run details for reporting randomness
+ - Bug fixes included in 2.4.0
+- Thanks to Andy Holmes for contributing.
+
+## 2.3.4 - August 30, 2020
+
+- Fixed a regression in 2.3.0 which caused include paths in the config file to be treated as additional spec paths.
+- The TAP reporter now outputs the test plan at the beginning instead of the end, as it should.
+- The internal copy of the Jasmine library has been updated to version 2.3.4, which brings in the minor bugfixes from 2.3.1, 2.3.2, and 2.3.3 as well.
+- Thanks to Andy Holmes for contributing.
+
+## 2.3.0 - August 25, 2020
+
+- Added a `--debug` command line flag which will run the tests under GDB or the debugger of your choice.
+- Added an `--interpreter` command line flag which allows using a different interpreter than whichever copy of `gjs` is in your path.
+- Fixed several bugs around the loading of spec files.
+- Improved error messages.
+- Jasmine GJS now depends on GJS 1.58.0.
+- The internal copy of the Jasmine library has been updated to 2.3.0, which brings:
+ - `done.fail()` for asynchronous specs.
+ - `toContain()` can be used for finding substrings.
+ - `toThrow()` can be used to check that a particular value was thrown.
+- Thanks to Niv Sardi, Bart Libert and Andy Holmes for contributing.
+
+## 2.2.1 - June 30, 2015
+
+- We now use `/usr/bin/env` to locate jasmine-gjs which allows Jasmine to be used with a development version of GJS. (Thanks to Sam Spilsbury)
+- We don't exit with `System.exit()` on success, because that bypasses the GJS interpreter shutdown actions. (Thanks to Sam Spilsbury)
+- The internal copy of the Jasmine library has been updated to version 2.2.1, which is a minor bugfix release.
+
+## 2.2.0 - May 17, 2015
+
+- You can now specify file patterns to exclude using the `--exclude`
+ command line option.
+ Previously you could only do this via the config file.
+- You can now set environment variables in the config file using the
+ `"environment"` key.
+- When you specify a directory for JUnit reports to be placed in, that
+ directory will now be created if it doesn't already exist.
+- If the argument to `--junit` is not an absolute path, then the path
+ will be resolved relative to the current directory.
+ However, you can now resolve it relative to a different path by
+ setting the environment variable `JASMINE_JUNIT_REPORTS_DIR`.
+- The verbose and TAP reporters now report the reason why a spec has
+ been marked pending, if any reason has been given.
+- The internal copy of the Jasmine library has been updated to version
+ 2.2.0, including the following features:
+ - the `toThrowError()` matcher to expect a particular exception
+ - the `jasmine.anything()` object to match anything
+ - the `jasmine.arrayContaining()` object to match an array containing
+ all of the given objects
+ - the `jasmine.stringMatching()` object to match a string that matches
+ the given regular expression or substring
+ - custom matching objects with `asymmetricMatch` methods
+ - per-spec timeouts with an extra argument to `it()`, `beforeEach()`,
+ and `afterEach()`
+
+## 2.1.3 - March 4, 2015
+
+- Initial release.
--- /dev/null
- // Don't put any code after this; the return value is used as the exit code.
- await Command.run(_jasmine, ARGV, 10);
+#!/usr/bin/env -S gjs -m
+
+/* global jasmineImporter */
+
+import GLib from 'gi://GLib';
++import System from 'system';
+
+const pkgdatadir = GLib.getenv('TEST_PKGDATADIR') ?? '@pkgdatadir@';
+const jasmineMod = GLib.getenv('TEST_JASMINE_MOD') ?? '@jasmine_mod@';
+
+// Create a separate GJS importer object for Jasmine modules, so that Jasmine's
+// modules are not exposed to test code (e.g. client code might have its own
+// Utils module.)
+// This means that all imports within Jasmine must use jasmineImporter rather
+// than imports. That includes imports of Jasmine modules in the tests. It would
+// be better to test a separate copy of Jasmine code, but importing most modules
+// registers a GType, and we cannot register two GTypes with the same name in
+// the same process.
+
+const oldSearchPath = imports.searchPath.slice(); // make a copy
+imports.searchPath.unshift(GLib.path_get_dirname(pkgdatadir));
+globalThis.jasmineImporter = imports[jasmineMod];
+imports.searchPath = oldSearchPath;
+
+const base = `file://${pkgdatadir}`;
+
+const Command = await import(`${base}/command.js`);
+const JasmineBoot = await import(`${base}/jasmineBoot.js`);
+
+// Do not conflict with global "jasmine" object
+const _jasmine = new JasmineBoot.Jasmine();
+_jasmine.installAPI(globalThis);
+
++System.exit(await Command.run(_jasmine, ARGV, 10));
--- /dev/null
- import * as System from 'system';
+#!/usr/bin/env -S gjs -m
+
+import GLib from 'gi://GLib';
- // Don't put any code after this; the return value is used as the exit code.
- (function () {
- if (process.get_if_exited())
- return process.get_exit_status();
- return 1;
- })();
++import System from 'system';
+
+const pkglibexecdir = GLib.getenv('TEST_PKGLIBEXECDIR') ?? '@pkglibexecdir@';
+const pkgdatadir = GLib.getenv('TEST_PKGDATADIR') ?? '@pkgdatadir@';
+
+const runnerPath = `${pkglibexecdir}/jasmine-runner`;
+const base = `file://${pkgdatadir}`;
+
+const Config = await import(`${base}/config.js`);
+const Options = await import(`${base}/options.js`);
+
+const [files, options] = Options.parseOptions(ARGV);
+
+if (options.version) {
+ print('Jasmine @PACKAGE_VERSION@');
+ System.exit(0);
+}
+
+const config = Config.loadConfig(options);
+
+// Launch Jasmine in a subprocess so we can control the environment
+const launcher = Config.prepareLauncher(config, options);
+let args = Config.configToArgs(config, files, options);
+args.unshift(runnerPath); // argv[0]
+args = Config.wrapArgs(args, config, options);
+const process = launcher.spawnv(args);
+process.wait(null);
+
++if (process.get_if_exited())
++ System.exit(process.get_exit_status());
++
++System.exit(1);
--- /dev/null
++jasmine-gjs (3.10.1-1) UNRELEASED; urgency=low
++
++ * Upgrade to 3.10.1
++
++ -- Philip Chimento <philip.chimento@gmail.com> Sun, 14 Jul 2024 13:59:43 -0700
++
+jasmine-gjs (2.6.4-1) unstable; urgency=low
+
+ * Upgrade to 2.6.4
+
+ -- Andy Holmes <andrew.g.r.holmes@gmail.com> Thu, 10 Sep 2020 21:47:34 -0700
+
+jasmine-gjs (2.5.2-1) unstable; urgency=low
+
+ * Upgrade to 2.5.2
+
+ -- Andy Holmes <andrew.g.r.holmes@gmail.com> Fri, 04 Sep 2020 19:20:51 -0700
+
+jasmine-gjs (2.4.1-1) unstable; urgency=low
+
+ * Upgrade to 2.4.1
+
+ -- Andy Holmes <andrew.g.r.holmes@gmail.com> Sat, 29 Aug 2020 19:46:28 -0700
+
+jasmine-gjs (2.3.4-1) unstable; urgency=low
+
+ * Upgrade to 2.3.4
+
+ -- Andy Holmes <andrew.g.r.holmes@gmail.com> Wed, 26 Aug 2020 16:34:43 -0700
+
+jasmine-gjs (2.3.0-1) unstable; urgency=low
+
+ * Upgrade to 2.3.0
+ * control: Bump GJS requirement to 1.58.0
+ * control, rules: Meson build system
+ * control: Update to modern versions of standards and debhelper-compat
+
+ -- Philip Chimento <philip.chimento@gmail.com> Tue, 25 Aug 2020 22:19:41 -0700
+
+jasmine-gjs (2.2.1-1) unstable; urgency=low
+
+ * Upgrade to 2.2.1
+
+ -- Philip Chimento <philip.chimento@gmail.com> Tue, 30 Jun 2015 14:24:39 -0700
+
+jasmine-gjs (2.2.0-1) unstable; urgency=low
+
+ * Upgrade to 2.2.0
+ * copyright: Update copyright year of upstream Jasmine
+ * docs: Add new NEWS.md file
+
+ -- Philip Chimento <philip.chimento@gmail.com> Mon, 18 May 2015 01:03:37 -0700
+
+jasmine-gjs (2.1.3-1) unstable; urgency=low
+
+ * Initial release
+
+ -- Philip Chimento <philip.chimento@gmail.com> Sun, 01 Mar 2015 15:25:17 -0800
--- /dev/null
- gjs (>= 1.58.0),
- meson (>= 0.50.0)
+Source: jasmine-gjs
+Section: devel
+Priority: optional
+Maintainer: Philip Chimento <philip.chimento@gmail.com>
+Build-Depends: debhelper-compat (= 12),
+ gir1.2-glib-2.0,
- gjs (>= 1.58.0)
++ gjs (>= 1.71.1),
++ meson (>= 0.58.0)
+Standards-Version: 4.5.0
+Homepage: https://github.com/ptomato/jasmine-gjs
+
+Package: jasmine-gjs
+Architecture: all
+Depends: ${misc:Depends},
+ gir1.2-glib-2.0,
++ gjs (>= 1.71.1)
+Description: Behavior-driven development framework for GJS
+ This module allows you to run Jasmine specs for your GJS code. The output will
+ be displayed in your terminal.
--- /dev/null
- Version: 2.6.4
+Name: jasmine-gjs
- Source0: http://ptomato.name/downloads/jasmine-gjs-2.6.4.tar.xz
++Version: 3.10.1
+Release: 1%{?dist}
+Summary: A behavior-driven development framework for GJS
+
+License: MIT
+URL: https://github.com/ptomato/jasmine-gjs
- BuildRequires: gjs >= 1.58.0
++Source0: https://github.com/ptomato/jasmine-gjs/releases/download/3.10.1/jasmine-gjs-3.10.1.tar.xz
+
+BuildArch: noarch
- BuildRequires: meson >= 0.50.0
- Requires: gjs >= 1.58.0
++BuildRequires: gjs >= 1.71.1
+BuildRequires: gobject-introspection
- * Fri Sep 10 2020 Andy Holmes <andrew.g.r.holmes@gmail.com> - 2.6.4-1
++BuildRequires: meson >= 0.58.0
++Requires: gjs >= 1.71.1
+Requires: gobject-introspection
+
+%description
+This module allows you to run Jasmine specs for your GJS code. The output will
+be displayed in your terminal.
+
+%prep
+%autosetup
+
+
+%build
+%meson
+%meson_build
+
+
+%install
+%meson_install
+
+
+%check
+%meson_test
+
+
+%files
+%doc README.md
+%doc NEWS.md
+%doc COPYING
+%doc %{_mandir}/man1/jasmine.1.gz
+%{_bindir}/jasmine
+%{_libexecdir}/%{name}/
+%{_datadir}/%{name}/
+
+
+%changelog
++* Sun Jul 14 2024 Philip Chimento <philip.chimento@gmail.com> - 3.10.1-1
++- Update requirements for version 3.10.1.
++* Thu Sep 10 2020 Andy Holmes <andrew.g.r.holmes@gmail.com> - 2.6.4-1
+- Update to version 2.6.4.
+* Fri Sep 4 2020 Andy Holmes <andrew.g.r.holmes@gmail.com> - 2.5.2-1
+- Update to version 2.5.2.
+* Sat Aug 29 2020 Andy Holmes <andrew.g.r.holmes@gmail.com> - 2.4.1-1
+- Update to version 2.4.1.
+* Wed Aug 26 2020 Andy Holmes <andrew.g.r.holmes@gmail.com> - 2.3.4-1
+- Update to version 2.3.4.
+* Mon Aug 24 2020 Philip Chimento <philip.chimento@gmail.com> - 2.3.0-1
+- Update to version 2.3.0.
+* Tue Jun 30 2015 Philip Chimento <philip.chimento@gmail.com> - 2.2.1-1
+- Update to version 2.2.1.
+* Sun May 17 2015 Philip Chimento <philip.chimento@gmail.com> - 2.2.0-1
+- Update to version 2.2.0.
+* Wed Mar 4 2015 Philip Chimento <philip.chimento@gmail.com> - 2.1.3-1
+- Initial packaging.
--- /dev/null
- /* jscs:disable */
+/*
- Copyright (c) 2008-2021 Pivotal Labs
++Copyright (c) 2008-2022 Pivotal Labs
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+*/
+// eslint-disable-next-line no-unused-vars
+var getJasmineRequireObj = (function(jasmineGlobal) {
+ var jasmineRequire;
+
+ if (
+ typeof module !== 'undefined' &&
+ module.exports &&
+ typeof exports !== 'undefined'
+ ) {
+ if (typeof global !== 'undefined') {
+ jasmineGlobal = global;
+ } else {
+ jasmineGlobal = {};
+ }
+ jasmineRequire = exports;
+ } else {
+ if (
+ typeof window !== 'undefined' &&
+ typeof window.toString === 'function' &&
+ window.toString() === '[object GjsGlobal]'
+ ) {
+ jasmineGlobal = window;
+ }
+ jasmineRequire = jasmineGlobal.jasmineRequire = {};
+ }
+
+ function getJasmineRequire() {
+ return jasmineRequire;
+ }
+
+ getJasmineRequire().core = function(jRequire) {
+ var j$ = {};
+
+ jRequire.base(j$, jasmineGlobal);
+ j$.util = jRequire.util(j$);
+ j$.errors = jRequire.errors();
+ j$.formatErrorMsg = jRequire.formatErrorMsg();
+ j$.Any = jRequire.Any(j$);
+ j$.Anything = jRequire.Anything(j$);
+ j$.CallTracker = jRequire.CallTracker(j$);
- j$.MockDate = jRequire.MockDate();
++ j$.MockDate = jRequire.MockDate(j$);
+ j$.getClearStack = jRequire.clearStack(j$);
+ j$.Clock = jRequire.Clock();
+ j$.DelayedFunctionScheduler = jRequire.DelayedFunctionScheduler(j$);
++ j$.Deprecator = jRequire.Deprecator(j$);
+ j$.Env = jRequire.Env(j$);
++ j$.deprecatingThisProxy = jRequire.deprecatingThisProxy(j$);
++ j$.deprecatingSuiteProxy = jRequire.deprecatingSuiteProxy(j$);
++ j$.deprecatingSpecProxy = jRequire.deprecatingSpecProxy(j$);
+ j$.StackTrace = jRequire.StackTrace(j$);
+ j$.ExceptionFormatter = jRequire.ExceptionFormatter(j$);
+ j$.ExpectationFilterChain = jRequire.ExpectationFilterChain();
+ j$.Expector = jRequire.Expector(j$);
+ j$.Expectation = jRequire.Expectation(j$);
+ j$.buildExpectationResult = jRequire.buildExpectationResult(j$);
+ j$.JsApiReporter = jRequire.JsApiReporter(j$);
+ j$.asymmetricEqualityTesterArgCompatShim = jRequire.asymmetricEqualityTesterArgCompatShim(
+ j$
+ );
+ j$.makePrettyPrinter = jRequire.makePrettyPrinter(j$);
- j$.pp = j$.makePrettyPrinter();
++ j$.basicPrettyPrinter_ = j$.makePrettyPrinter();
++ Object.defineProperty(j$, 'pp', {
++ get: function() {
++ j$.getEnv().deprecated(
++ 'jasmine.pp is deprecated and will be removed in a future release. ' +
++ 'Use the pp method of the matchersUtil passed to the matcher factory ' +
++ "or the asymmetric equality tester's `asymmetricMatch` method " +
++ 'instead. See ' +
++ '<https://jasmine.github.io/tutorials/upgrading_to_Jasmine_4.0#static-utils> for details.'
++ );
++ return j$.basicPrettyPrinter_;
++ }
++ });
+ j$.MatchersUtil = jRequire.MatchersUtil(j$);
- j$.matchersUtil = new j$.MatchersUtil({
++ var staticMatchersUtil = new j$.MatchersUtil({
+ customTesters: [],
- pp: j$.pp
++ pp: j$.basicPrettyPrinter_
++ });
++ Object.defineProperty(j$, 'matchersUtil', {
++ get: function() {
++ j$.getEnv().deprecated(
++ 'jasmine.matchersUtil is deprecated and will be removed ' +
++ 'in a future release. Use the instance passed to the matcher factory or ' +
++ "the asymmetric equality tester's `asymmetricMatch` method instead. " +
++ 'See <https://jasmine.github.io/tutorials/upgrading_to_Jasmine_4.0#static-utils> for details.'
++ );
++ return staticMatchersUtil;
++ }
+ });
+
+ j$.ObjectContaining = jRequire.ObjectContaining(j$);
+ j$.ArrayContaining = jRequire.ArrayContaining(j$);
+ j$.ArrayWithExactContents = jRequire.ArrayWithExactContents(j$);
+ j$.MapContaining = jRequire.MapContaining(j$);
+ j$.SetContaining = jRequire.SetContaining(j$);
+ j$.QueueRunner = jRequire.QueueRunner(j$);
+ j$.ReportDispatcher = jRequire.ReportDispatcher(j$);
+ j$.Spec = jRequire.Spec(j$);
+ j$.Spy = jRequire.Spy(j$);
+ j$.SpyFactory = jRequire.SpyFactory(j$);
+ j$.SpyRegistry = jRequire.SpyRegistry(j$);
+ j$.SpyStrategy = jRequire.SpyStrategy(j$);
+ j$.StringMatching = jRequire.StringMatching(j$);
+ j$.StringContaining = jRequire.StringContaining(j$);
+ j$.UserContext = jRequire.UserContext(j$);
+ j$.Suite = jRequire.Suite(j$);
+ j$.Timer = jRequire.Timer();
+ j$.TreeProcessor = jRequire.TreeProcessor();
+ j$.version = jRequire.version();
+ j$.Order = jRequire.Order();
+ j$.DiffBuilder = jRequire.DiffBuilder(j$);
+ j$.NullDiffBuilder = jRequire.NullDiffBuilder(j$);
+ j$.ObjectPath = jRequire.ObjectPath(j$);
+ j$.MismatchTree = jRequire.MismatchTree(j$);
+ j$.GlobalErrors = jRequire.GlobalErrors(j$);
+
+ j$.Truthy = jRequire.Truthy(j$);
+ j$.Falsy = jRequire.Falsy(j$);
+ j$.Empty = jRequire.Empty(j$);
+ j$.NotEmpty = jRequire.NotEmpty(j$);
+
+ j$.matchers = jRequire.requireMatchers(jRequire, j$);
+ j$.asyncMatchers = jRequire.requireAsyncMatchers(jRequire, j$);
+
+ return j$;
+ };
+
+ return getJasmineRequire;
+})(this);
+
+getJasmineRequireObj().requireMatchers = function(jRequire, j$) {
+ var availableMatchers = [
+ 'nothing',
+ 'toBe',
+ 'toBeCloseTo',
+ 'toBeDefined',
+ 'toBeInstanceOf',
+ 'toBeFalse',
+ 'toBeFalsy',
+ 'toBeGreaterThan',
+ 'toBeGreaterThanOrEqual',
+ 'toBeLessThan',
+ 'toBeLessThanOrEqual',
+ 'toBeNaN',
+ 'toBeNegativeInfinity',
+ 'toBeNull',
+ 'toBePositiveInfinity',
+ 'toBeTrue',
+ 'toBeTruthy',
+ 'toBeUndefined',
+ 'toContain',
+ 'toEqual',
+ 'toHaveSize',
+ 'toHaveBeenCalled',
+ 'toHaveBeenCalledBefore',
+ 'toHaveBeenCalledOnceWith',
+ 'toHaveBeenCalledTimes',
+ 'toHaveBeenCalledWith',
+ 'toHaveClass',
+ 'toMatch',
+ 'toThrow',
+ 'toThrowError',
+ 'toThrowMatching'
+ ],
+ matchers = {};
+
+ for (var i = 0; i < availableMatchers.length; i++) {
+ var name = availableMatchers[i];
+ matchers[name] = jRequire[name](j$);
+ }
+
+ return matchers;
+};
+
+getJasmineRequireObj().base = function(j$, jasmineGlobal) {
+ j$.unimplementedMethod_ = function() {
+ throw new Error('unimplemented method');
+ };
+
+ /**
+ * Maximum object depth the pretty printer will print to.
+ * Set this to a lower value to speed up pretty printing if you have large objects.
+ * @name jasmine.MAX_PRETTY_PRINT_DEPTH
+ * @default 8
+ * @since 1.3.0
+ */
+ j$.MAX_PRETTY_PRINT_DEPTH = 8;
+ /**
+ * Maximum number of array elements to display when pretty printing objects.
+ * This will also limit the number of keys and values displayed for an object.
+ * Elements past this number will be ellipised.
+ * @name jasmine.MAX_PRETTY_PRINT_ARRAY_LENGTH
+ * @default 50
+ * @since 2.7.0
+ */
+ j$.MAX_PRETTY_PRINT_ARRAY_LENGTH = 50;
+ /**
+ * Maximum number of characters to display when pretty printing objects.
+ * Characters past this number will be ellipised.
+ * @name jasmine.MAX_PRETTY_PRINT_CHARS
+ * @default 100
+ * @since 2.9.0
+ */
+ j$.MAX_PRETTY_PRINT_CHARS = 1000;
+ /**
+ * Default number of milliseconds Jasmine will wait for an asynchronous spec,
+ * before, or after function to complete. This can be overridden on a case by
+ * case basis by passing a time limit as the third argument to {@link it},
+ * {@link beforeEach}, {@link afterEach}, {@link beforeAll}, or
+ * {@link afterAll}. The value must be no greater than the largest number of
+ * milliseconds supported by setTimeout, which is usually 2147483647.
+ *
+ * While debugging tests, you may want to set this to a large number (or pass
+ * a large number to one of the functions mentioned above) so that Jasmine
+ * does not move on to after functions or the next spec while you're debugging.
+ * @name jasmine.DEFAULT_TIMEOUT_INTERVAL
+ * @default 5000
+ * @since 1.3.0
+ */
+ var DEFAULT_TIMEOUT_INTERVAL = 5000;
+ Object.defineProperty(j$, 'DEFAULT_TIMEOUT_INTERVAL', {
+ get: function() {
+ return DEFAULT_TIMEOUT_INTERVAL;
+ },
+ set: function(newValue) {
+ j$.util.validateTimeout(newValue, 'jasmine.DEFAULT_TIMEOUT_INTERVAL');
+ DEFAULT_TIMEOUT_INTERVAL = newValue;
+ }
+ });
+
+ j$.getGlobal = function() {
+ return jasmineGlobal;
+ };
+
+ /**
+ * Get the currently booted Jasmine Environment.
+ *
+ * @name jasmine.getEnv
+ * @since 1.3.0
+ * @function
+ * @return {Env}
+ */
+ j$.getEnv = function(options) {
+ var env = (j$.currentEnv_ = j$.currentEnv_ || new j$.Env(options));
+ //jasmine. singletons in here (setTimeout blah blah).
+ return env;
+ };
+
+ j$.isArray_ = function(value) {
+ return j$.isA_('Array', value);
+ };
+
+ j$.isObject_ = function(value) {
+ return (
+ !j$.util.isUndefined(value) && value !== null && j$.isA_('Object', value)
+ );
+ };
+
+ j$.isString_ = function(value) {
+ return j$.isA_('String', value);
+ };
+
+ j$.isNumber_ = function(value) {
+ return j$.isA_('Number', value);
+ };
+
+ j$.isFunction_ = function(value) {
+ return j$.isA_('Function', value);
+ };
+
+ j$.isAsyncFunction_ = function(value) {
+ return j$.isA_('AsyncFunction', value);
+ };
+
+ j$.isGeneratorFunction_ = function(value) {
+ return j$.isA_('GeneratorFunction', value);
+ };
+
+ j$.isTypedArray_ = function(value) {
+ return (
+ j$.isA_('Float32Array', value) ||
+ j$.isA_('Float64Array', value) ||
+ j$.isA_('Int16Array', value) ||
+ j$.isA_('Int32Array', value) ||
+ j$.isA_('Int8Array', value) ||
+ j$.isA_('Uint16Array', value) ||
+ j$.isA_('Uint32Array', value) ||
+ j$.isA_('Uint8Array', value) ||
+ j$.isA_('Uint8ClampedArray', value)
+ );
+ };
+
+ j$.isA_ = function(typeName, value) {
+ return j$.getType_(value) === '[object ' + typeName + ']';
+ };
+
+ j$.isError_ = function(value) {
+ if (!value) {
+ return false;
+ }
+
+ if (value instanceof Error) {
+ return true;
+ }
+ if (
+ typeof window !== 'undefined' &&
+ typeof window.trustedTypes !== 'undefined'
+ ) {
+ return (
+ typeof value.stack === 'string' && typeof value.message === 'string'
+ );
+ }
+ if (value && value.constructor && value.constructor.constructor) {
+ var valueGlobal = value.constructor.constructor('return this');
+ if (j$.isFunction_(valueGlobal)) {
+ valueGlobal = valueGlobal();
+ }
+
+ if (valueGlobal.Error && value instanceof valueGlobal.Error) {
+ return true;
+ }
+ }
+ return false;
+ };
+
+ j$.isAsymmetricEqualityTester_ = function(obj) {
- return obj?.asymmetricMatch ? j$.isA_('Function', obj.asymmetricMatch) : false;
++ return obj ? j$.isA_('Function', obj.asymmetricMatch) : false;
+ };
+
+ j$.getType_ = function(value) {
+ return Object.prototype.toString.apply(value);
+ };
+
+ j$.isDomNode = function(obj) {
+ // Node is a function, because constructors
+ return typeof jasmineGlobal.Node !== 'undefined'
+ ? obj instanceof jasmineGlobal.Node
+ : obj !== null &&
+ typeof obj === 'object' &&
+ typeof obj.nodeType === 'number' &&
+ typeof obj.nodeName === 'string';
+ // return obj.nodeType > 0;
+ };
+
+ j$.isMap = function(obj) {
+ return (
+ obj !== null &&
+ typeof obj !== 'undefined' &&
+ typeof jasmineGlobal.Map !== 'undefined' &&
+ obj.constructor === jasmineGlobal.Map
+ );
+ };
+
+ j$.isSet = function(obj) {
+ return (
+ obj !== null &&
+ typeof obj !== 'undefined' &&
+ typeof jasmineGlobal.Set !== 'undefined' &&
+ obj.constructor === jasmineGlobal.Set
+ );
+ };
+
+ j$.isWeakMap = function(obj) {
+ return (
+ obj !== null &&
+ typeof obj !== 'undefined' &&
+ typeof jasmineGlobal.WeakMap !== 'undefined' &&
+ obj.constructor === jasmineGlobal.WeakMap
+ );
+ };
+
+ j$.isURL = function(obj) {
+ return (
+ obj !== null &&
+ typeof obj !== 'undefined' &&
+ typeof jasmineGlobal.URL !== 'undefined' &&
+ obj.constructor === jasmineGlobal.URL
+ );
+ };
+
+ j$.isDataView = function(obj) {
+ return (
+ obj !== null &&
+ typeof obj !== 'undefined' &&
+ typeof jasmineGlobal.DataView !== 'undefined' &&
+ obj.constructor === jasmineGlobal.DataView
+ );
+ };
+
+ j$.isPromise = function(obj) {
+ return (
+ typeof jasmineGlobal.Promise !== 'undefined' &&
+ !!obj &&
+ obj.constructor === jasmineGlobal.Promise
+ );
+ };
+
+ j$.isPromiseLike = function(obj) {
+ return !!obj && j$.isFunction_(obj.then);
+ };
+
+ j$.fnNameFor = function(func) {
+ if (func.name) {
+ return func.name;
+ }
+
+ var matches =
+ func.toString().match(/^\s*function\s*(\w+)\s*\(/) ||
+ func.toString().match(/^\s*\[object\s*(\w+)Constructor\]/);
+
+ return matches ? matches[1] : '<anonymous>';
+ };
+
+ j$.isPending_ = function(promise) {
+ var sentinel = {};
+ // eslint-disable-next-line compat/compat
+ return Promise.race([promise, Promise.resolve(sentinel)]).then(
+ function(result) {
+ return result === sentinel;
+ },
+ function() {
+ return false;
+ }
+ );
+ };
+
+ /**
+ * Get an {@link AsymmetricEqualityTester}, usable in any {@link matchers|matcher} that uses Jasmine's equality (e.g. {@link matchers#toEqual|toEqual}, {@link matchers#toContain|toContain}, or {@link matchers#toHaveBeenCalledWith|toHaveBeenCalledWith}),
+ * that will succeed if the actual value being compared is an instance of the specified class/constructor.
+ * @name jasmine.any
+ * @since 1.3.0
+ * @function
+ * @param {Constructor} clazz - The constructor to check against.
+ */
+ j$.any = function(clazz) {
+ return new j$.Any(clazz);
+ };
+
+ /**
+ * Get an {@link AsymmetricEqualityTester}, usable in any {@link matchers|matcher} that uses Jasmine's equality (e.g. {@link matchers#toEqual|toEqual}, {@link matchers#toContain|toContain}, or {@link matchers#toHaveBeenCalledWith|toHaveBeenCalledWith}),
+ * that will succeed if the actual value being compared is not `null` and not `undefined`.
+ * @name jasmine.anything
+ * @since 2.2.0
+ * @function
+ */
+ j$.anything = function() {
+ return new j$.Anything();
+ };
+
+ /**
+ * Get an {@link AsymmetricEqualityTester}, usable in any {@link matchers|matcher} that uses Jasmine's equality (e.g. {@link matchers#toEqual|toEqual}, {@link matchers#toContain|toContain}, or {@link matchers#toHaveBeenCalledWith|toHaveBeenCalledWith}),
+ * that will succeed if the actual value being compared is `true` or anything truthy.
+ * @name jasmine.truthy
+ * @since 3.1.0
+ * @function
+ */
+ j$.truthy = function() {
+ return new j$.Truthy();
+ };
+
+ /**
+ * Get an {@link AsymmetricEqualityTester}, usable in any {@link matchers|matcher} that uses Jasmine's equality (e.g. {@link matchers#toEqual|toEqual}, {@link matchers#toContain|toContain}, or {@link matchers#toHaveBeenCalledWith|toHaveBeenCalledWith}),
+ * that will succeed if the actual value being compared is `null`, `undefined`, `0`, `false` or anything falsey.
+ * @name jasmine.falsy
+ * @since 3.1.0
+ * @function
+ */
+ j$.falsy = function() {
+ return new j$.Falsy();
+ };
+
+ /**
+ * Get an {@link AsymmetricEqualityTester}, usable in any {@link matchers|matcher} that uses Jasmine's equality (e.g. {@link matchers#toEqual|toEqual}, {@link matchers#toContain|toContain}, or {@link matchers#toHaveBeenCalledWith|toHaveBeenCalledWith}),
+ * that will succeed if the actual value being compared is empty.
+ * @name jasmine.empty
+ * @since 3.1.0
+ * @function
+ */
+ j$.empty = function() {
+ return new j$.Empty();
+ };
+
+ /**
+ * Get an {@link AsymmetricEqualityTester}, usable in any {@link matchers|matcher} that uses Jasmine's equality (e.g. {@link matchers#toEqual|toEqual}, {@link matchers#toContain|toContain}, or {@link matchers#toHaveBeenCalledWith|toHaveBeenCalledWith}),
+ * that will succeed if the actual value being compared is not empty.
+ * @name jasmine.notEmpty
+ * @since 3.1.0
+ * @function
+ */
+ j$.notEmpty = function() {
+ return new j$.NotEmpty();
+ };
+
+ /**
+ * Get an {@link AsymmetricEqualityTester}, usable in any {@link matchers|matcher} that uses Jasmine's equality (e.g. {@link matchers#toEqual|toEqual}, {@link matchers#toContain|toContain}, or {@link matchers#toHaveBeenCalledWith|toHaveBeenCalledWith}),
+ * that will succeed if the actual value being compared contains at least the keys and values.
+ * @name jasmine.objectContaining
+ * @since 1.3.0
+ * @function
+ * @param {Object} sample - The subset of properties that _must_ be in the actual.
+ */
+ j$.objectContaining = function(sample) {
+ return new j$.ObjectContaining(sample);
+ };
+
+ /**
+ * Get an {@link AsymmetricEqualityTester}, usable in any {@link matchers|matcher} that uses Jasmine's equality (e.g. {@link matchers#toEqual|toEqual}, {@link matchers#toContain|toContain}, or {@link matchers#toHaveBeenCalledWith|toHaveBeenCalledWith}),
+ * that will succeed if the actual value is a `String` that matches the `RegExp` or `String`.
+ * @name jasmine.stringMatching
+ * @since 2.2.0
+ * @function
+ * @param {RegExp|String} expected
+ */
+ j$.stringMatching = function(expected) {
+ return new j$.StringMatching(expected);
+ };
+
+ /**
+ * Get an {@link AsymmetricEqualityTester}, usable in any {@link matchers|matcher} that uses Jasmine's equality (e.g. {@link matchers#toEqual|toEqual}, {@link matchers#toContain|toContain}, or {@link matchers#toHaveBeenCalledWith|toHaveBeenCalledWith}),
+ * that will succeed if the actual value is a `String` that contains the specified `String`.
+ * @name jasmine.stringContaining
+ * @since 3.10.0
+ * @function
+ * @param {String} expected
+ */
+ j$.stringContaining = function(expected) {
+ return new j$.StringContaining(expected);
+ };
+
+ /**
+ * Get an {@link AsymmetricEqualityTester}, usable in any {@link matchers|matcher} that uses Jasmine's equality (e.g. {@link matchers#toEqual|toEqual}, {@link matchers#toContain|toContain}, or {@link matchers#toHaveBeenCalledWith|toHaveBeenCalledWith}),
+ * that will succeed if the actual value is an `Array` that contains at least the elements in the sample.
+ * @name jasmine.arrayContaining
+ * @since 2.2.0
+ * @function
+ * @param {Array} sample
+ */
+ j$.arrayContaining = function(sample) {
+ return new j$.ArrayContaining(sample);
+ };
+
+ /**
+ * Get an {@link AsymmetricEqualityTester}, usable in any {@link matchers|matcher} that uses Jasmine's equality (e.g. {@link matchers#toEqual|toEqual}, {@link matchers#toContain|toContain}, or {@link matchers#toHaveBeenCalledWith|toHaveBeenCalledWith}),
+ * that will succeed if the actual value is an `Array` that contains all of the elements in the sample in any order.
+ * @name jasmine.arrayWithExactContents
+ * @since 2.8.0
+ * @function
+ * @param {Array} sample
+ */
+ j$.arrayWithExactContents = function(sample) {
+ return new j$.ArrayWithExactContents(sample);
+ };
+
+ /**
+ * Get an {@link AsymmetricEqualityTester}, usable in any {@link matchers|matcher} that uses Jasmine's equality (e.g. {@link matchers#toEqual|toEqual}, {@link matchers#toContain|toContain}, or {@link matchers#toHaveBeenCalledWith|toHaveBeenCalledWith}),
+ * that will succeed if every key/value pair in the sample passes the deep equality comparison
+ * with at least one key/value pair in the actual value being compared
+ * @name jasmine.mapContaining
+ * @since 3.5.0
+ * @function
+ * @param {Map} sample - The subset of items that _must_ be in the actual.
+ */
+ j$.mapContaining = function(sample) {
+ return new j$.MapContaining(sample);
+ };
+
+ /**
+ * Get an {@link AsymmetricEqualityTester}, usable in any {@link matchers|matcher} that uses Jasmine's equality (e.g. {@link matchers#toEqual|toEqual}, {@link matchers#toContain|toContain}, or {@link matchers#toHaveBeenCalledWith|toHaveBeenCalledWith}),
+ * that will succeed if every item in the sample passes the deep equality comparison
+ * with at least one item in the actual value being compared
+ * @name jasmine.setContaining
+ * @since 3.5.0
+ * @function
+ * @param {Set} sample - The subset of items that _must_ be in the actual.
+ */
+ j$.setContaining = function(sample) {
+ return new j$.SetContaining(sample);
+ };
+
+ /**
+ * Determines whether the provided function is a Jasmine spy.
+ * @name jasmine.isSpy
+ * @since 2.0.0
+ * @function
+ * @param {Function} putativeSpy - The function to check.
+ * @return {Boolean}
+ */
+ j$.isSpy = function(putativeSpy) {
- if (!putativeSpy || !putativeSpy.and) {
++ if (!putativeSpy) {
+ return false;
+ }
+ return (
+ putativeSpy.and instanceof j$.SpyStrategy &&
+ putativeSpy.calls instanceof j$.CallTracker
+ );
+ };
+};
+
+getJasmineRequireObj().util = function(j$) {
+ var util = {};
+
+ util.inherit = function(childClass, parentClass) {
+ var Subclass = function() {};
+ Subclass.prototype = parentClass.prototype;
+ childClass.prototype = new Subclass();
+ };
+
+ util.argsToArray = function(args) {
+ var arrayOfArgs = [];
+ for (var i = 0; i < args.length; i++) {
+ arrayOfArgs.push(args[i]);
+ }
+ return arrayOfArgs;
+ };
+
+ util.isUndefined = function(obj) {
+ return obj === void 0;
+ };
+
+ util.arrayContains = function(array, search) {
+ var i = array.length;
+ while (i--) {
+ if (array[i] === search) {
+ return true;
+ }
+ }
+ return false;
+ };
+
+ util.clone = function(obj) {
+ if (Object.prototype.toString.apply(obj) === '[object Array]') {
+ return obj.slice();
+ }
+
+ var cloned = {};
+ for (var prop in obj) {
+ if (obj.hasOwnProperty(prop)) {
+ cloned[prop] = obj[prop];
+ }
+ }
+
+ return cloned;
+ };
+
+ util.cloneArgs = function(args) {
+ var clonedArgs = [];
+ var argsAsArray = j$.util.argsToArray(args);
+ for (var i = 0; i < argsAsArray.length; i++) {
+ var str = Object.prototype.toString.apply(argsAsArray[i]),
+ primitives = /^\[object (Boolean|String|RegExp|Number)/;
+
+ // All falsey values are either primitives, `null`, or `undefined.
+ if (!argsAsArray[i] || str.match(primitives)) {
+ clonedArgs.push(argsAsArray[i]);
+ } else {
+ clonedArgs.push(j$.util.clone(argsAsArray[i]));
+ }
+ }
+ return clonedArgs;
+ };
+
+ util.getPropertyDescriptor = function(obj, methodName) {
+ var descriptor,
+ proto = obj;
+
+ do {
+ descriptor = Object.getOwnPropertyDescriptor(proto, methodName);
+ proto = Object.getPrototypeOf(proto);
+ } while (!descriptor && proto);
+
+ return descriptor;
+ };
+
+ util.objectDifference = function(obj, toRemove) {
+ var diff = {};
+
+ for (var key in obj) {
+ if (util.has(obj, key) && !util.has(toRemove, key)) {
+ diff[key] = obj[key];
+ }
+ }
+
+ return diff;
+ };
+
+ util.has = function(obj, key) {
+ return Object.prototype.hasOwnProperty.call(obj, key);
+ };
+
+ util.errorWithStack = function errorWithStack() {
+ // Don't throw and catch if we don't have to, because it makes it harder
+ // for users to debug their code with exception breakpoints.
+ var error = new Error();
+
+ if (error.stack) {
+ return error;
+ }
+
+ // But some browsers (e.g. Phantom) only provide a stack trace if we throw.
+ try {
+ throw new Error();
+ } catch (e) {
+ return e;
+ }
+ };
+
+ function callerFile() {
+ var trace = new j$.StackTrace(util.errorWithStack());
+ return trace.frames[2].file;
+ }
+
+ util.jasmineFile = (function() {
+ var result;
+
+ return function() {
+ if (!result) {
+ result = callerFile();
+ }
+
+ return result;
+ };
+ })();
+
+ function StopIteration() {}
+ StopIteration.prototype = Object.create(Error.prototype);
+ StopIteration.prototype.constructor = StopIteration;
+
+ // useful for maps and sets since `forEach` is the only IE11-compatible way to iterate them
+ util.forEachBreakable = function(iterable, iteratee) {
+ function breakLoop() {
+ throw new StopIteration();
+ }
+
+ try {
+ iterable.forEach(function(value, key) {
+ iteratee(breakLoop, value, key, iterable);
+ });
+ } catch (error) {
+ if (!(error instanceof StopIteration)) throw error;
+ }
+ };
+
+ util.validateTimeout = function(timeout, msgPrefix) {
+ // Timeouts are implemented with setTimeout, which only supports a limited
+ // range of values. The limit is unspecified, as is the behavior when it's
+ // exceeded. But on all currently supported JS runtimes, setTimeout calls
+ // the callback immediately when the timeout is greater than 2147483647
+ // (the maximum value of a signed 32 bit integer).
+ var max = 2147483647;
+
+ if (timeout > max) {
+ throw new Error(
+ (msgPrefix || 'Timeout value') + ' cannot be greater than ' + max
+ );
+ }
+ };
+
+ return util;
+};
+
+getJasmineRequireObj().Spec = function(j$) {
+ /**
+ * @interface Spec
+ * @see Configuration#specFilter
+ * @since 2.0.0
+ */
+ function Spec(attrs) {
+ this.expectationFactory = attrs.expectationFactory;
+ this.asyncExpectationFactory = attrs.asyncExpectationFactory;
+ this.resultCallback = attrs.resultCallback || function() {};
+ /**
+ * The unique ID of this spec.
+ * @name Spec#id
+ * @readonly
+ * @type {string}
+ * @since 2.0.0
+ */
+ this.id = attrs.id;
+ /**
+ * The description passed to the {@link it} that created this spec.
+ * @name Spec#description
+ * @readonly
+ * @type {string}
+ * @since 2.0.0
+ */
+ this.description = attrs.description || '';
+ this.queueableFn = attrs.queueableFn;
+ this.beforeAndAfterFns =
+ attrs.beforeAndAfterFns ||
+ function() {
+ return { befores: [], afters: [] };
+ };
+ this.userContext =
+ attrs.userContext ||
+ function() {
+ return {};
+ };
+ this.onStart = attrs.onStart || function() {};
+ this.autoCleanClosures =
+ attrs.autoCleanClosures === undefined ? true : !!attrs.autoCleanClosures;
+ this.getSpecName =
+ attrs.getSpecName ||
+ function() {
+ return '';
+ };
+ this.expectationResultFactory =
+ attrs.expectationResultFactory || function() {};
++ this.deprecated = attrs.deprecated || function() {};
+ this.queueRunnerFactory = attrs.queueRunnerFactory || function() {};
+ this.catchingExceptions =
+ attrs.catchingExceptions ||
+ function() {
+ return true;
+ };
+ this.throwOnExpectationFailure = !!attrs.throwOnExpectationFailure;
+ this.timer = attrs.timer || new j$.Timer();
+
+ if (!this.queueableFn.fn) {
+ this.exclude();
+ }
+
+ /**
+ * @typedef SpecResult
+ * @property {Int} id - The unique id of this spec.
+ * @property {String} description - The description passed to the {@link it} that created this spec.
+ * @property {String} fullName - The full description including all ancestors of this spec.
+ * @property {Expectation[]} failedExpectations - The list of expectations that failed during execution of this spec.
+ * @property {Expectation[]} passedExpectations - The list of expectations that passed during execution of this spec.
+ * @property {Expectation[]} deprecationWarnings - The list of deprecation warnings that occurred during execution this spec.
+ * @property {String} pendingReason - If the spec is {@link pending}, this will be the reason.
+ * @property {String} status - Once the spec has completed, this string represents the pass/fail status of this spec.
+ * @property {number} duration - The time in ms used by the spec execution, including any before/afterEach.
+ * @property {Object} properties - User-supplied properties, if any, that were set using {@link Env#setSpecProperty}
+ * @since 2.0.0
+x */
+ this.result = {
+ id: this.id,
+ description: this.description,
+ fullName: this.getFullName(),
+ failedExpectations: [],
+ passedExpectations: [],
+ deprecationWarnings: [],
+ pendingReason: '',
+ duration: null,
+ properties: null
+ };
+ }
+
+ Spec.prototype.addExpectationResult = function(passed, data, isError) {
+ var expectationResult = this.expectationResultFactory(data);
+ if (passed) {
+ this.result.passedExpectations.push(expectationResult);
+ } else {
+ this.result.failedExpectations.push(expectationResult);
+
+ if (this.throwOnExpectationFailure && !isError) {
+ throw new j$.errors.ExpectationFailed();
+ }
+ }
+ };
+
+ Spec.prototype.setSpecProperty = function(key, value) {
+ this.result.properties = this.result.properties || {};
+ this.result.properties[key] = value;
+ };
+
+ Spec.prototype.expect = function(actual) {
+ return this.expectationFactory(actual, this);
+ };
+
+ Spec.prototype.expectAsync = function(actual) {
+ return this.asyncExpectationFactory(actual, this);
+ };
+
+ Spec.prototype.execute = function(onComplete, excluded, failSpecWithNoExp) {
+ var self = this;
+
+ var onStart = {
+ fn: function(done) {
+ self.timer.start();
+ self.onStart(self, done);
+ }
+ };
+
+ var complete = {
+ fn: function(done) {
+ if (self.autoCleanClosures) {
+ self.queueableFn.fn = null;
+ }
+ self.result.status = self.status(excluded, failSpecWithNoExp);
+ self.result.duration = self.timer.elapsed();
+ self.resultCallback(self.result, done);
+ }
+ };
+
+ var fns = this.beforeAndAfterFns();
+ var regularFns = fns.befores.concat(this.queueableFn);
+
+ var runnerConfig = {
+ isLeaf: true,
+ queueableFns: regularFns,
+ cleanupFns: fns.afters,
+ onException: function() {
+ self.onException.apply(self, arguments);
+ },
- onComplete: function() {
- onComplete(
- self.result.status === 'failed' &&
- new j$.StopExecutionError('spec failed')
++ onMultipleDone: function() {
++ // Issue a deprecation. Include the context ourselves and pass
++ // ignoreRunnable: true, since getting here always means that we've already
++ // moved on and the current runnable isn't the one that caused the problem.
++ self.deprecated(
++ "An asynchronous function called its 'done' " +
++ 'callback more than once. This is a bug in the spec, beforeAll, ' +
++ 'beforeEach, afterAll, or afterEach function in question. This will ' +
++ 'be treated as an error in a future version. See' +
++ '<https://jasmine.github.io/tutorials/upgrading_to_Jasmine_4.0#deprecations-due-to-calling-done-multiple-times> ' +
++ 'for more information.\n' +
++ '(in spec: ' +
++ self.getFullName() +
++ ')',
++ { ignoreRunnable: true }
+ );
+ },
- userContext: this.userContext()
++ onComplete: function() {
++ if (self.result.status === 'failed') {
++ onComplete(new j$.StopExecutionError('spec failed'));
++ } else {
++ onComplete();
++ }
++ },
++ userContext: this.userContext(),
++ runnableName: this.getFullName.bind(this)
+ };
+
+ if (this.markedPending || excluded === true) {
+ runnerConfig.queueableFns = [];
+ runnerConfig.cleanupFns = [];
+ }
+
+ runnerConfig.queueableFns.unshift(onStart);
+ runnerConfig.cleanupFns.push(complete);
+
+ this.queueRunnerFactory(runnerConfig);
+ };
+
+ Spec.prototype.reset = function() {
+ /**
+ * @typedef SpecResult
+ * @property {Int} id - The unique id of this spec.
+ * @property {String} description - The description passed to the {@link it} that created this spec.
+ * @property {String} fullName - The full description including all ancestors of this spec.
+ * @property {Expectation[]} failedExpectations - The list of expectations that failed during execution of this spec.
+ * @property {Expectation[]} passedExpectations - The list of expectations that passed during execution of this spec.
+ * @property {Expectation[]} deprecationWarnings - The list of deprecation warnings that occurred during execution this spec.
+ * @property {String} pendingReason - If the spec is {@link pending}, this will be the reason.
+ * @property {String} status - Once the spec has completed, this string represents the pass/fail status of this spec.
+ * @property {number} duration - The time in ms used by the spec execution, including any before/afterEach.
+ * @property {Object} properties - User-supplied properties, if any, that were set using {@link Env#setSpecProperty}
+ * @since 2.0.0
+ */
+ this.result = {
+ id: this.id,
+ description: this.description,
+ fullName: this.getFullName(),
+ failedExpectations: [],
+ passedExpectations: [],
+ deprecationWarnings: [],
+ pendingReason: this.excludeMessage,
+ duration: null,
+ properties: null,
+ trace: null
+ };
+ this.markedPending = this.markedExcluding;
+ };
+
+ Spec.prototype.onException = function onException(e) {
+ if (Spec.isPendingSpecException(e)) {
+ this.pend(extractCustomPendingMessage(e));
+ return;
+ }
+
+ if (e instanceof j$.errors.ExpectationFailed) {
+ return;
+ }
+
+ this.addExpectationResult(
+ false,
+ {
+ matcherName: '',
+ passed: false,
+ expected: '',
+ actual: '',
+ error: e
+ },
+ true
+ );
+ };
+
+ /*
+ * Marks state as pending
+ * @param {string} [message] An optional reason message
+ */
+ Spec.prototype.pend = function(message) {
+ this.markedPending = true;
+ if (message) {
+ this.result.pendingReason = message;
+ }
+ };
+
+ /*
+ * Like {@link Spec#pend}, but pending state will survive {@link Spec#reset}
+ * Useful for fit, xit, where pending state remains.
+ * @param {string} [message] An optional reason message
+ */
+ Spec.prototype.exclude = function(message) {
+ this.markedExcluding = true;
+ if (this.message) {
+ this.excludeMessage = message;
+ }
+ this.pend(message);
+ };
+
+ Spec.prototype.getResult = function() {
+ this.result.status = this.status();
+ return this.result;
+ };
+
+ Spec.prototype.status = function(excluded, failSpecWithNoExpectations) {
+ if (excluded === true) {
+ return 'excluded';
+ }
+
+ if (this.markedPending) {
+ return 'pending';
+ }
+
+ if (
+ this.result.failedExpectations.length > 0 ||
+ (failSpecWithNoExpectations &&
+ this.result.failedExpectations.length +
+ this.result.passedExpectations.length ===
+ 0)
+ ) {
+ return 'failed';
+ }
+
+ return 'passed';
+ };
+
+ /**
+ * The full description including all ancestors of this spec.
+ * @name Spec#getFullName
+ * @function
+ * @returns {string}
+ * @since 2.0.0
+ */
+ Spec.prototype.getFullName = function() {
+ return this.getSpecName(this);
+ };
+
+ Spec.prototype.addDeprecationWarning = function(deprecation) {
+ if (typeof deprecation === 'string') {
+ deprecation = { message: deprecation };
+ }
+ this.result.deprecationWarnings.push(
+ this.expectationResultFactory(deprecation)
+ );
+ };
+
+ var extractCustomPendingMessage = function(e) {
+ var fullMessage = e.toString(),
+ boilerplateStart = fullMessage.indexOf(Spec.pendingSpecExceptionMessage),
+ boilerplateEnd =
+ boilerplateStart + Spec.pendingSpecExceptionMessage.length;
+
+ return fullMessage.substr(boilerplateEnd);
+ };
+
+ Spec.pendingSpecExceptionMessage = '=> marked Pending';
+
+ Spec.isPendingSpecException = function(e) {
+ return !!(
+ e &&
+ e.toString &&
+ e.toString().indexOf(Spec.pendingSpecExceptionMessage) !== -1
+ );
+ };
+
+ return Spec;
+};
+
+if (typeof window == void 0 && typeof exports == 'object') {
+ /* globals exports */
+ exports.Spec = jasmineRequire.Spec;
+}
+
+/*jshint bitwise: false*/
+
+getJasmineRequireObj().Order = function() {
+ function Order(options) {
+ this.random = 'random' in options ? options.random : true;
+ var seed = (this.seed = options.seed || generateSeed());
+ this.sort = this.random ? randomOrder : naturalOrder;
+
+ function naturalOrder(items) {
+ return items;
+ }
+
+ function randomOrder(items) {
+ var copy = items.slice();
+ copy.sort(function(a, b) {
+ return jenkinsHash(seed + a.id) - jenkinsHash(seed + b.id);
+ });
+ return copy;
+ }
+
+ function generateSeed() {
+ return String(Math.random()).slice(-5);
+ }
+
+ // Bob Jenkins One-at-a-Time Hash algorithm is a non-cryptographic hash function
+ // used to get a different output when the key changes slightly.
+ // We use your return to sort the children randomly in a consistent way when
+ // used in conjunction with a seed
+
+ function jenkinsHash(key) {
+ var hash, i;
+ for (hash = i = 0; i < key.length; ++i) {
+ hash += key.charCodeAt(i);
+ hash += hash << 10;
+ hash ^= hash >> 6;
+ }
+ hash += hash << 3;
+ hash ^= hash >> 11;
+ hash += hash << 15;
+ return hash;
+ }
+ }
+
+ return Order;
+};
+
+getJasmineRequireObj().Env = function(j$) {
+ /**
+ * @class Env
+ * @since 2.0.0
+ * @classdesc The Jasmine environment.<br>
+ * _Note:_ Do not construct this directly. You can obtain the Env instance by
+ * calling {@link jasmine.getEnv}.
+ * @hideconstructor
+ */
+ function Env(options) {
+ options = options || {};
+
+ var self = this;
+ var global = options.global || j$.getGlobal();
+ var customPromise;
+
+ var totalSpecsDefined = 0;
+
+ var realSetTimeout = global.setTimeout;
+ var realClearTimeout = global.clearTimeout;
+ var clearStack = j$.getClearStack(global);
+ this.clock = new j$.Clock(
+ global,
+ function() {
+ return new j$.DelayedFunctionScheduler();
+ },
+ new j$.MockDate(global)
+ );
+
+ var runnableResources = {};
+
+ var currentSpec = null;
+ var currentlyExecutingSuites = [];
+ var currentDeclarationSuite = null;
+ var hasFailures = false;
+
+ /**
+ * This represents the available options to configure Jasmine.
+ * Options that are not provided will use their default values.
+ * @see Env#configure
+ * @interface Configuration
+ * @since 3.3.0
+ */
+ var config = {
+ /**
+ * Whether to randomize spec execution order
+ * @name Configuration#random
+ * @since 3.3.0
+ * @type Boolean
+ * @default true
+ */
+ random: true,
+ /**
+ * Seed to use as the basis of randomization.
+ * Null causes the seed to be determined randomly at the start of execution.
+ * @name Configuration#seed
+ * @since 3.3.0
+ * @type (number|string)
+ * @default null
+ */
+ seed: null,
+ /**
+ * Whether to stop execution of the suite after the first spec failure
+ * @name Configuration#failFast
+ * @since 3.3.0
+ * @type Boolean
+ * @default false
+ * @deprecated Use the `stopOnSpecFailure` config property instead.
+ */
+ failFast: false,
+ /**
+ * Whether to stop execution of the suite after the first spec failure
+ * @name Configuration#stopOnSpecFailure
+ * @since 3.9.0
+ * @type Boolean
+ * @default false
+ */
+ stopOnSpecFailure: false,
+ /**
+ * Whether to fail the spec if it ran no expectations. By default
+ * a spec that ran no expectations is reported as passed. Setting this
+ * to true will report such spec as a failure.
+ * @name Configuration#failSpecWithNoExpectations
+ * @since 3.5.0
+ * @type Boolean
+ * @default false
+ */
+ failSpecWithNoExpectations: false,
+ /**
+ * Whether to cause specs to only have one expectation failure.
+ * @name Configuration#oneFailurePerSpec
+ * @since 3.3.0
+ * @type Boolean
+ * @default false
+ * @deprecated Use the `stopSpecOnExpectationFailure` config property instead.
+ */
+ oneFailurePerSpec: false,
+ /**
+ * Whether to cause specs to only have one expectation failure.
+ * @name Configuration#stopSpecOnExpectationFailure
+ * @since 3.3.0
+ * @type Boolean
+ * @default false
+ */
+ stopSpecOnExpectationFailure: false,
+ /**
+ * A function that takes a spec and returns true if it should be executed
+ * or false if it should be skipped.
+ * @callback SpecFilter
+ * @param {Spec} spec - The spec that the filter is being applied to.
+ * @return boolean
+ */
+ /**
+ * Function to use to filter specs
+ * @name Configuration#specFilter
+ * @since 3.3.0
+ * @type SpecFilter
+ * @default A function that always returns true.
+ */
+ specFilter: function() {
+ return true;
+ },
+ /**
+ * Whether or not reporters should hide disabled specs from their output.
+ * Currently only supported by Jasmine's HTMLReporter
+ * @name Configuration#hideDisabled
+ * @since 3.3.0
+ * @type Boolean
+ * @default false
+ */
+ hideDisabled: false,
+ /**
+ * Set to provide a custom promise library that Jasmine will use if it needs
+ * to create a promise. If not set, it will default to whatever global Promise
+ * library is available (if any).
+ * @name Configuration#Promise
+ * @since 3.5.0
+ * @type function
+ * @default undefined
++ * @deprecated In a future version, Jasmine will ignore the Promise config
++ * property and always create native promises instead.
+ */
+ Promise: undefined,
+ /**
+ * Clean closures when a suite is done running (done by clearing the stored function reference).
+ * This prevents memory leaks, but you won't be able to run jasmine multiple times.
+ * @name Configuration#autoCleanClosures
+ * @since 3.10.0
+ * @type boolean
+ * @default true
+ */
- autoCleanClosures: true
++ autoCleanClosures: true,
++ /**
++ * Whether or not to issue warnings for certain deprecated functionality
++ * every time it's used. If not set or set to false, deprecation warnings
++ * for methods that tend to be called frequently will be issued only once
++ * or otherwise throttled to to prevent the suite output from being flooded
++ * with warnings.
++ * @name Configuration#verboseDeprecations
++ * @since 3.6.0
++ * @type Boolean
++ * @default false
++ */
++ verboseDeprecations: false
+ };
+
+ var currentSuite = function() {
+ return currentlyExecutingSuites[currentlyExecutingSuites.length - 1];
+ };
+
+ var currentRunnable = function() {
+ return currentSpec || currentSuite();
+ };
+
+ var globalErrors = null;
+
+ var installGlobalErrors = function() {
+ if (globalErrors) {
+ return;
+ }
+
+ globalErrors = new j$.GlobalErrors();
+ globalErrors.install();
+ };
+
+ if (!options.suppressLoadErrors) {
+ installGlobalErrors();
+ globalErrors.pushListener(function(
+ message,
+ filename,
+ lineno,
+ colNo,
+ err
+ ) {
+ topSuite.result.failedExpectations.push({
+ passed: false,
+ globalErrorType: 'load',
+ message: message,
+ stack: err && err.stack,
+ filename: filename,
+ lineno: lineno
+ });
+ });
+ }
+
+ /**
+ * Configure your jasmine environment
+ * @name Env#configure
+ * @since 3.3.0
+ * @argument {Configuration} configuration
+ * @function
+ */
+ this.configure = function(configuration) {
+ var booleanProps = [
+ 'random',
+ 'failSpecWithNoExpectations',
+ 'hideDisabled',
+ 'autoCleanClosures'
+ ];
+
+ booleanProps.forEach(function(prop) {
+ if (typeof configuration[prop] !== 'undefined') {
+ config[prop] = !!configuration[prop];
+ }
+ });
+
+ if (typeof configuration.failFast !== 'undefined') {
++ // We can't unconditionally issue a warning here because then users who
++ // get the configuration from Jasmine, modify it, and pass it back would
++ // see the warning.
++ if (configuration.failFast !== config.failFast) {
++ this.deprecated(
++ 'The `failFast` config property is deprecated and will be removed ' +
++ 'in a future version of Jasmine. Please use `stopOnSpecFailure` ' +
++ 'instead.',
++ { ignoreRunnable: true }
++ );
++ }
++
+ if (typeof configuration.stopOnSpecFailure !== 'undefined') {
+ if (configuration.stopOnSpecFailure !== configuration.failFast) {
+ throw new Error(
+ 'stopOnSpecFailure and failFast are aliases for ' +
+ "each other. Don't set failFast if you also set stopOnSpecFailure."
+ );
+ }
+ }
+
+ config.failFast = configuration.failFast;
+ config.stopOnSpecFailure = configuration.failFast;
+ } else if (typeof configuration.stopOnSpecFailure !== 'undefined') {
+ config.failFast = configuration.stopOnSpecFailure;
+ config.stopOnSpecFailure = configuration.stopOnSpecFailure;
+ }
+
+ if (typeof configuration.oneFailurePerSpec !== 'undefined') {
++ // We can't unconditionally issue a warning here because then users who
++ // get the configuration from Jasmine, modify it, and pass it back would
++ // see the warning.
++ if (configuration.oneFailurePerSpec !== config.oneFailurePerSpec) {
++ this.deprecated(
++ 'The `oneFailurePerSpec` config property is deprecated and will be ' +
++ 'removed in a future version of Jasmine. Please use ' +
++ '`stopSpecOnExpectationFailure` instead.',
++ { ignoreRunnable: true }
++ );
++ }
++
+ if (typeof configuration.stopSpecOnExpectationFailure !== 'undefined') {
+ if (
+ configuration.stopSpecOnExpectationFailure !==
+ configuration.oneFailurePerSpec
+ ) {
+ throw new Error(
+ 'stopSpecOnExpectationFailure and oneFailurePerSpec are aliases for ' +
+ "each other. Don't set oneFailurePerSpec if you also set stopSpecOnExpectationFailure."
+ );
+ }
+ }
+
+ config.oneFailurePerSpec = configuration.oneFailurePerSpec;
+ config.stopSpecOnExpectationFailure = configuration.oneFailurePerSpec;
+ } else if (
+ typeof configuration.stopSpecOnExpectationFailure !== 'undefined'
+ ) {
+ config.oneFailurePerSpec = configuration.stopSpecOnExpectationFailure;
+ config.stopSpecOnExpectationFailure =
+ configuration.stopSpecOnExpectationFailure;
+ }
+
+ if (configuration.specFilter) {
+ config.specFilter = configuration.specFilter;
+ }
+
+ if (typeof configuration.seed !== 'undefined') {
+ config.seed = configuration.seed;
+ }
+
+ // Don't use hasOwnProperty to check for Promise existence because Promise
+ // can be initialized to undefined, either explicitly or by using the
+ // object returned from Env#configuration. In particular, Karma does this.
+ if (configuration.Promise) {
+ if (
+ typeof configuration.Promise.resolve === 'function' &&
+ typeof configuration.Promise.reject === 'function'
+ ) {
+ customPromise = configuration.Promise;
++ self.deprecated(
++ 'The `Promise` config property is deprecated. Future versions ' +
++ 'of Jasmine will create native promises even if the `Promise` ' +
++ 'config property is set. Please remove it.'
++ );
+ } else {
+ throw new Error(
+ 'Custom promise library missing `resolve`/`reject` functions'
+ );
+ }
+ }
++
++ if (configuration.hasOwnProperty('verboseDeprecations')) {
++ config.verboseDeprecations = configuration.verboseDeprecations;
++ deprecator.verboseDeprecations(config.verboseDeprecations);
++ }
+ };
+
+ /**
+ * Get the current configuration for your jasmine environment
+ * @name Env#configuration
+ * @since 3.3.0
+ * @function
+ * @returns {Configuration}
+ */
+ this.configuration = function() {
+ var result = {};
+ for (var property in config) {
+ result[property] = config[property];
+ }
+ return result;
+ };
+
+ Object.defineProperty(this, 'specFilter', {
+ get: function() {
+ self.deprecated(
- 'Getting specFilter directly from Env is deprecated and will be removed in a future version of Jasmine, please check the specFilter option from `configuration`'
++ 'Getting specFilter directly from Env is deprecated and will be ' +
++ 'removed in a future version of Jasmine. Please check the ' +
++ 'specFilter option from `configuration` instead.',
++ { ignoreRunnable: true }
+ );
+ return config.specFilter;
+ },
+ set: function(val) {
+ self.deprecated(
- 'Setting specFilter directly on Env is deprecated and will be removed in a future version of Jasmine, please use the specFilter option in `configure`'
++ 'Setting specFilter directly on Env is deprecated and will be ' +
++ 'removed in a future version of Jasmine. Please use the ' +
++ 'specFilter option in `configure` instead.',
++ { ignoreRunnable: true }
+ );
+ config.specFilter = val;
+ }
+ });
+
+ this.setDefaultSpyStrategy = function(defaultStrategyFn) {
+ if (!currentRunnable()) {
+ throw new Error(
+ 'Default spy strategy must be set in a before function or a spec'
+ );
+ }
+ runnableResources[
+ currentRunnable().id
+ ].defaultStrategyFn = defaultStrategyFn;
+ };
+
+ this.addSpyStrategy = function(name, fn) {
+ if (!currentRunnable()) {
+ throw new Error(
+ 'Custom spy strategies must be added in a before function or a spec'
+ );
+ }
+ runnableResources[currentRunnable().id].customSpyStrategies[name] = fn;
+ };
+
+ this.addCustomEqualityTester = function(tester) {
+ if (!currentRunnable()) {
+ throw new Error(
+ 'Custom Equalities must be added in a before function or a spec'
+ );
+ }
+ runnableResources[currentRunnable().id].customEqualityTesters.push(
+ tester
+ );
+ };
+
+ this.addMatchers = function(matchersToAdd) {
+ if (!currentRunnable()) {
+ throw new Error(
+ 'Matchers must be added in a before function or a spec'
+ );
+ }
+ var customMatchers =
+ runnableResources[currentRunnable().id].customMatchers;
+
+ for (var matcherName in matchersToAdd) {
++ if (matchersToAdd[matcherName].length > 1) {
++ self.deprecated(
++ 'The matcher factory for "' +
++ matcherName +
++ '" ' +
++ 'accepts custom equality testers, but this parameter will no longer be ' +
++ 'passed in a future release. ' +
++ 'See <https://jasmine.github.io/tutorials/upgrading_to_Jasmine_4.0#matchers-cet> for details.'
++ );
++ }
++
+ customMatchers[matcherName] = matchersToAdd[matcherName];
+ }
+ };
+
+ this.addAsyncMatchers = function(matchersToAdd) {
+ if (!currentRunnable()) {
+ throw new Error(
+ 'Async Matchers must be added in a before function or a spec'
+ );
+ }
+ var customAsyncMatchers =
+ runnableResources[currentRunnable().id].customAsyncMatchers;
+
+ for (var matcherName in matchersToAdd) {
++ if (matchersToAdd[matcherName].length > 1) {
++ self.deprecated(
++ 'The matcher factory for "' +
++ matcherName +
++ '" ' +
++ 'accepts custom equality testers, but this parameter will no longer be ' +
++ 'passed in a future release. ' +
++ 'See <https://jasmine.github.io/tutorials/upgrading_to_Jasmine_4.0#matchers-cet> for details.'
++ );
++ }
++
+ customAsyncMatchers[matcherName] = matchersToAdd[matcherName];
+ }
+ };
+
+ this.addCustomObjectFormatter = function(formatter) {
+ if (!currentRunnable()) {
+ throw new Error(
+ 'Custom object formatters must be added in a before function or a spec'
+ );
+ }
+
+ runnableResources[currentRunnable().id].customObjectFormatters.push(
+ formatter
+ );
+ };
+
+ j$.Expectation.addCoreMatchers(j$.matchers);
+ j$.Expectation.addAsyncCoreMatchers(j$.asyncMatchers);
+
+ var nextSpecId = 0;
+ var getNextSpecId = function() {
+ return 'spec' + nextSpecId++;
+ };
+
+ var nextSuiteId = 0;
+ var getNextSuiteId = function() {
+ return 'suite' + nextSuiteId++;
+ };
+
+ var makePrettyPrinter = function() {
+ var customObjectFormatters =
+ runnableResources[currentRunnable().id].customObjectFormatters;
+ return j$.makePrettyPrinter(customObjectFormatters);
+ };
+
+ var makeMatchersUtil = function() {
+ var customEqualityTesters =
+ runnableResources[currentRunnable().id].customEqualityTesters;
+ return new j$.MatchersUtil({
+ customTesters: customEqualityTesters,
+ pp: makePrettyPrinter()
+ });
+ };
+
+ var expectationFactory = function(actual, spec) {
+ var customEqualityTesters =
+ runnableResources[spec.id].customEqualityTesters;
+
+ return j$.Expectation.factory({
+ matchersUtil: makeMatchersUtil(),
+ customEqualityTesters: customEqualityTesters,
+ customMatchers: runnableResources[spec.id].customMatchers,
+ actual: actual,
+ addExpectationResult: addExpectationResult
+ });
+
+ function addExpectationResult(passed, result) {
+ return spec.addExpectationResult(passed, result);
+ }
+ };
+
+ function recordLateExpectation(runable, runableType, result) {
+ var delayedExpectationResult = {};
+ Object.keys(result).forEach(function(k) {
+ delayedExpectationResult[k] = result[k];
+ });
+ delayedExpectationResult.passed = false;
+ delayedExpectationResult.globalErrorType = 'lateExpectation';
+ delayedExpectationResult.message =
+ runableType +
+ ' "' +
+ runable.getFullName() +
+ '" ran a "' +
+ result.matcherName +
+ '" expectation after it finished.\n';
+
+ if (result.message) {
+ delayedExpectationResult.message +=
+ 'Message: "' + result.message + '"\n';
+ }
+
+ delayedExpectationResult.message +=
+ '1. Did you forget to return or await the result of expectAsync?\n' +
+ '2. Was done() invoked before an async operation completed?\n' +
+ '3. Did an expectation follow a call to done()?';
+
+ topSuite.result.failedExpectations.push(delayedExpectationResult);
+ }
+
+ var asyncExpectationFactory = function(actual, spec, runableType) {
+ return j$.Expectation.asyncFactory({
+ matchersUtil: makeMatchersUtil(),
+ customEqualityTesters: runnableResources[spec.id].customEqualityTesters,
+ customAsyncMatchers: runnableResources[spec.id].customAsyncMatchers,
+ actual: actual,
+ addExpectationResult: addExpectationResult
+ });
+
+ function addExpectationResult(passed, result) {
+ if (currentRunnable() !== spec) {
+ recordLateExpectation(spec, runableType, result);
+ }
+ return spec.addExpectationResult(passed, result);
+ }
+ };
+ var suiteAsyncExpectationFactory = function(actual, suite) {
+ return asyncExpectationFactory(actual, suite, 'Suite');
+ };
+
+ var specAsyncExpectationFactory = function(actual, suite) {
+ return asyncExpectationFactory(actual, suite, 'Spec');
+ };
+
+ var defaultResourcesForRunnable = function(id, parentRunnableId) {
+ var resources = {
+ spies: [],
+ customEqualityTesters: [],
+ customMatchers: {},
+ customAsyncMatchers: {},
+ customSpyStrategies: {},
+ defaultStrategyFn: undefined,
+ customObjectFormatters: []
+ };
+
+ if (runnableResources[parentRunnableId]) {
+ resources.customEqualityTesters = j$.util.clone(
+ runnableResources[parentRunnableId].customEqualityTesters
+ );
+ resources.customMatchers = j$.util.clone(
+ runnableResources[parentRunnableId].customMatchers
+ );
+ resources.customAsyncMatchers = j$.util.clone(
+ runnableResources[parentRunnableId].customAsyncMatchers
+ );
+ resources.customObjectFormatters = j$.util.clone(
+ runnableResources[parentRunnableId].customObjectFormatters
+ );
+ resources.defaultStrategyFn =
+ runnableResources[parentRunnableId].defaultStrategyFn;
+ }
+
+ runnableResources[id] = resources;
+ };
+
+ var clearResourcesForRunnable = function(id) {
+ spyRegistry.clearSpies();
+ delete runnableResources[id];
+ };
+
+ var beforeAndAfterFns = function(targetSuite) {
+ return function() {
+ var befores = [],
+ afters = [],
+ suite = targetSuite;
+
+ while (suite) {
+ befores = befores.concat(suite.beforeFns);
+ afters = afters.concat(suite.afterFns);
+
+ suite = suite.parentSuite;
+ }
+
+ return {
+ befores: befores.reverse(),
+ afters: afters
+ };
+ };
+ };
+
+ var getSpecName = function(spec, suite) {
+ var fullName = [spec.description],
+ suiteFullName = suite.getFullName();
+
+ if (suiteFullName !== '') {
+ fullName.unshift(suiteFullName);
+ }
+ return fullName.join(' ');
+ };
+
+ // TODO: we may just be able to pass in the fn instead of wrapping here
+ var buildExpectationResult = j$.buildExpectationResult,
+ exceptionFormatter = new j$.ExceptionFormatter(),
+ expectationResultFactory = function(attrs) {
+ attrs.messageFormatter = exceptionFormatter.message;
+ attrs.stackFormatter = exceptionFormatter.stack;
+
+ return buildExpectationResult(attrs);
+ };
+
+ /**
+ * Sets whether Jasmine should throw an Error when an expectation fails.
+ * This causes a spec to only have one expectation failure.
+ * @name Env#throwOnExpectationFailure
+ * @since 2.3.0
+ * @function
+ * @param {Boolean} value Whether to throw when a expectation fails
+ * @deprecated Use the `stopSpecOnExpectationFailure` option with {@link Env#configure}
+ */
+ this.throwOnExpectationFailure = function(value) {
+ this.deprecated(
+ 'Setting throwOnExpectationFailure directly on Env is deprecated and ' +
+ 'will be removed in a future version of Jasmine. Please use the ' +
- 'stopSpecOnExpectationFailure option in `configure`.'
++ 'stopSpecOnExpectationFailure option in `configure`.',
++ { ignoreRunnable: true }
+ );
+ this.configure({ oneFailurePerSpec: !!value });
+ };
+
+ this.throwingExpectationFailures = function() {
+ this.deprecated(
+ 'Getting throwingExpectationFailures directly from Env is deprecated ' +
+ 'and will be removed in a future version of Jasmine. Please check ' +
- 'the stopSpecOnExpectationFailure option from `configuration`.'
++ 'the stopSpecOnExpectationFailure option from `configuration`.',
++ { ignoreRunnable: true }
+ );
+ return config.oneFailurePerSpec;
+ };
+
+ /**
+ * Set whether to stop suite execution when a spec fails
+ * @name Env#stopOnSpecFailure
+ * @since 2.7.0
+ * @function
+ * @param {Boolean} value Whether to stop suite execution when a spec fails
+ * @deprecated Use the `stopOnSpecFailure` option with {@link Env#configure}
+ */
+ this.stopOnSpecFailure = function(value) {
+ this.deprecated(
+ 'Setting stopOnSpecFailure directly is deprecated and will be ' +
+ 'removed in a future version of Jasmine. Please use the ' +
- 'stopOnSpecFailure option in `configure`.'
++ 'stopOnSpecFailure option in `configure`.',
++ { ignoreRunnable: true }
+ );
+ this.configure({ stopOnSpecFailure: !!value });
+ };
+
+ this.stoppingOnSpecFailure = function() {
+ this.deprecated(
+ 'Getting stoppingOnSpecFailure directly from Env is deprecated and ' +
+ 'will be removed in a future version of Jasmine. Please check the ' +
- 'stopOnSpecFailure option from `configuration`.'
++ 'stopOnSpecFailure option from `configuration`.',
++ { ignoreRunnable: true }
+ );
+ return config.failFast;
+ };
+
+ /**
+ * Set whether to randomize test execution order
+ * @name Env#randomizeTests
+ * @since 2.4.0
+ * @function
+ * @param {Boolean} value Whether to randomize execution order
+ * @deprecated Use the `random` option with {@link Env#configure}
+ */
+ this.randomizeTests = function(value) {
+ this.deprecated(
- 'Setting randomizeTests directly is deprecated and will be removed in a future version of Jasmine, please use the random option in `configure`'
++ 'Setting randomizeTests directly is deprecated and will be removed ' +
++ 'in a future version of Jasmine. Please use the random option in ' +
++ '`configure` instead.',
++ { ignoreRunnable: true }
+ );
+ config.random = !!value;
+ };
+
+ this.randomTests = function() {
+ this.deprecated(
- 'Getting randomTests directly from Env is deprecated and will be removed in a future version of Jasmine, please check the random option from `configuration`'
++ 'Getting randomTests directly from Env is deprecated and will be ' +
++ 'removed in a future version of Jasmine. Please check the random ' +
++ 'option from `configuration` instead.',
++ { ignoreRunnable: true }
+ );
+ return config.random;
+ };
+
+ /**
+ * Set the random number seed for spec randomization
+ * @name Env#seed
+ * @since 2.4.0
+ * @function
+ * @param {Number} value The seed value
+ * @deprecated Use the `seed` option with {@link Env#configure}
+ */
+ this.seed = function(value) {
+ this.deprecated(
- 'Setting seed directly is deprecated and will be removed in a future version of Jasmine, please use the seed option in `configure`'
++ 'Setting seed directly is deprecated and will be removed in a ' +
++ 'future version of Jasmine. Please use the seed option in ' +
++ '`configure` instead.',
++ { ignoreRunnable: true }
+ );
+ if (value) {
+ config.seed = value;
+ }
+ return config.seed;
+ };
+
+ this.hidingDisabled = function(value) {
+ this.deprecated(
- 'Getting hidingDisabled directly from Env is deprecated and will be removed in a future version of Jasmine, please check the hideDisabled option from `configuration`'
++ 'Getting hidingDisabled directly from Env is deprecated and will ' +
++ 'be removed in a future version of Jasmine. Please check the ' +
++ 'hideDisabled option from `configuration` instead.',
++ { ignoreRunnable: true }
+ );
+ return config.hideDisabled;
+ };
+
+ /**
+ * @name Env#hideDisabled
+ * @since 3.2.0
+ * @function
+ * @deprecated Use the `hideDisabled` option with {@link Env#configure}
+ */
+ this.hideDisabled = function(value) {
+ this.deprecated(
- 'Setting hideDisabled directly is deprecated and will be removed in a future version of Jasmine, please use the hideDisabled option in `configure`'
++ 'Setting hideDisabled directly is deprecated and will be removed ' +
++ 'in a future version of Jasmine. Please use the hideDisabled option ' +
++ 'in `configure` instead.',
++ { ignoreRunnable: true }
+ );
+ config.hideDisabled = !!value;
+ };
+
- this.deprecated = function(deprecation) {
++ /**
++ * Causes a deprecation warning to be logged to the console and reported to
++ * reporters.
++ *
++ * The optional second parameter is an object that can have either of the
++ * following properties:
++ *
++ * omitStackTrace: Whether to omit the stack trace. Optional. Defaults to
++ * false. This option is ignored if the deprecation is an Error. Set this
++ * when the stack trace will not contain anything that helps the user find
++ * the source of the deprecation.
++ *
++ * ignoreRunnable: Whether to log the deprecation on the root suite, ignoring
++ * the spec or suite that's running when it happens. Optional. Defaults to
++ * false.
++ *
++ * @name Env#deprecated
++ * @since 2.99
++ * @function
++ * @param {String|Error} deprecation The deprecation message
++ * @param {Object} [options] Optional extra options, as described above
++ */
++ this.deprecated = function(deprecation, options) {
+ var runnable = currentRunnable() || topSuite;
- var context;
-
- if (runnable === topSuite) {
- context = '';
- } else if (runnable === currentSuite()) {
- context = ' (in suite: ' + runnable.getFullName() + ')';
- } else {
- context = ' (in spec: ' + runnable.getFullName() + ')';
- }
-
- runnable.addDeprecationWarning(deprecation);
- if (
- typeof console !== 'undefined' &&
- typeof console.error === 'function'
- ) {
- console.error('DEPRECATION: ' + deprecation + context);
- }
++ deprecator.addDeprecationWarning(runnable, deprecation, options);
+ };
+
+ var queueRunnerFactory = function(options, args) {
+ var failFast = false;
+ if (options.isLeaf) {
+ failFast = config.stopSpecOnExpectationFailure;
+ } else if (!options.isReporter) {
+ failFast = config.stopOnSpecFailure;
+ }
+ options.clearStack = options.clearStack || clearStack;
+ options.timeout = {
+ setTimeout: realSetTimeout,
+ clearTimeout: realClearTimeout
+ };
+ options.fail = self.fail;
+ options.globalErrors = globalErrors;
+ options.completeOnFirstError = failFast;
+ options.onException =
+ options.onException ||
+ function(e) {
+ (currentRunnable() || topSuite).onException(e);
+ };
+ options.deprecated = self.deprecated;
+
+ new j$.QueueRunner(options).execute(args);
+ };
+
+ var topSuite = new j$.Suite({
+ env: this,
+ id: getNextSuiteId(),
+ description: 'Jasmine__TopLevel__Suite',
+ expectationFactory: expectationFactory,
+ asyncExpectationFactory: suiteAsyncExpectationFactory,
+ expectationResultFactory: expectationResultFactory,
+ autoCleanClosures: config.autoCleanClosures
+ });
++ var deprecator = new j$.Deprecator(topSuite);
+ currentDeclarationSuite = topSuite;
+
+ /**
+ * Provides the root suite, through which all suites and specs can be
+ * accessed.
+ * @function
+ * @name Env#topSuite
+ * @return {Suite} the root suite
+ * @since 2.0.0
+ */
+ this.topSuite = function() {
- return topSuite;
++ return j$.deprecatingSuiteProxy(topSuite, null, this);
+ };
+
+ /**
+ * This represents the available reporter callback for an object passed to {@link Env#addReporter}.
+ * @interface Reporter
+ * @see custom_reporter
+ */
+ var reporter = new j$.ReportDispatcher(
+ [
+ /**
+ * `jasmineStarted` is called after all of the specs have been loaded, but just before execution starts.
+ * @function
+ * @name Reporter#jasmineStarted
+ * @param {JasmineStartedInfo} suiteInfo Information about the full Jasmine suite that is being run
+ * @param {Function} [done] Used to specify to Jasmine that this callback is asynchronous and Jasmine should wait until it has been called before moving on.
+ * @returns {} Optionally return a Promise instead of using `done` to cause Jasmine to wait for completion.
+ * @see async
+ */
+ 'jasmineStarted',
+ /**
+ * When the entire suite has finished execution `jasmineDone` is called
+ * @function
+ * @name Reporter#jasmineDone
+ * @param {JasmineDoneInfo} suiteInfo Information about the full Jasmine suite that just finished running.
+ * @param {Function} [done] Used to specify to Jasmine that this callback is asynchronous and Jasmine should wait until it has been called before moving on.
+ * @returns {} Optionally return a Promise instead of using `done` to cause Jasmine to wait for completion.
+ * @see async
+ */
+ 'jasmineDone',
+ /**
+ * `suiteStarted` is invoked when a `describe` starts to run
+ * @function
+ * @name Reporter#suiteStarted
+ * @param {SuiteResult} result Information about the individual {@link describe} being run
+ * @param {Function} [done] Used to specify to Jasmine that this callback is asynchronous and Jasmine should wait until it has been called before moving on.
+ * @returns {} Optionally return a Promise instead of using `done` to cause Jasmine to wait for completion.
+ * @see async
+ */
+ 'suiteStarted',
+ /**
+ * `suiteDone` is invoked when all of the child specs and suites for a given suite have been run
+ *
+ * While jasmine doesn't require any specific functions, not defining a `suiteDone` will make it impossible for a reporter to know when a suite has failures in an `afterAll`.
+ * @function
+ * @name Reporter#suiteDone
+ * @param {SuiteResult} result
+ * @param {Function} [done] Used to specify to Jasmine that this callback is asynchronous and Jasmine should wait until it has been called before moving on.
+ * @returns {} Optionally return a Promise instead of using `done` to cause Jasmine to wait for completion.
+ * @see async
+ */
+ 'suiteDone',
+ /**
+ * `specStarted` is invoked when an `it` starts to run (including associated `beforeEach` functions)
+ * @function
+ * @name Reporter#specStarted
+ * @param {SpecResult} result Information about the individual {@link it} being run
+ * @param {Function} [done] Used to specify to Jasmine that this callback is asynchronous and Jasmine should wait until it has been called before moving on.
+ * @returns {} Optionally return a Promise instead of using `done` to cause Jasmine to wait for completion.
+ * @see async
+ */
+ 'specStarted',
+ /**
+ * `specDone` is invoked when an `it` and its associated `beforeEach` and `afterEach` functions have been run.
+ *
+ * While jasmine doesn't require any specific functions, not defining a `specDone` will make it impossible for a reporter to know when a spec has failed.
+ * @function
+ * @name Reporter#specDone
+ * @param {SpecResult} result
+ * @param {Function} [done] Used to specify to Jasmine that this callback is asynchronous and Jasmine should wait until it has been called before moving on.
+ * @returns {} Optionally return a Promise instead of using `done` to cause Jasmine to wait for completion.
+ * @see async
+ */
+ 'specDone'
+ ],
- queueRunnerFactory
++ queueRunnerFactory,
++ self.deprecated
+ );
+
+ /**
+ * Executes the specs.
+ *
+ * If called with no parameters or with a falsy value as the first parameter,
+ * all specs will be executed except those that are excluded by a
+ * [spec filter]{@link Configuration#specFilter} or other mechanism. If the
+ * first parameter is a list of spec/suite IDs, only those specs/suites will
+ * be run.
+ *
+ * Both parameters are optional, but a completion callback is only valid as
+ * the second parameter. To specify a completion callback but not a list of
+ * specs/suites to run, pass null or undefined as the first parameter.
+ *
+ * execute should not be called more than once.
+ *
+ * If the environment supports promises, execute will return a promise that
+ * is resolved after the suite finishes executing. The promise will be
+ * resolved (not rejected) as long as the suite runs to completion. Use a
+ * {@link Reporter} to determine whether or not the suite passed.
+ *
+ * @name Env#execute
+ * @since 2.0.0
+ * @function
+ * @param {(string[])=} runnablesToRun IDs of suites and/or specs to run
+ * @param {Function=} onComplete Function that will be called after all specs have run
+ * @return {Promise<undefined>}
+ */
+ this.execute = function(runnablesToRun, onComplete) {
+ if (this._executedBefore) {
+ topSuite.reset();
+ }
+ this._executedBefore = true;
+ defaultResourcesForRunnable(topSuite.id);
+ installGlobalErrors();
+
+ if (!runnablesToRun) {
+ if (focusedRunnables.length) {
+ runnablesToRun = focusedRunnables;
+ } else {
+ runnablesToRun = [topSuite.id];
+ }
+ }
+
+ var order = new j$.Order({
+ random: config.random,
+ seed: config.seed
+ });
+
+ var processor = new j$.TreeProcessor({
+ tree: topSuite,
+ runnableIds: runnablesToRun,
+ queueRunnerFactory: queueRunnerFactory,
+ failSpecWithNoExpectations: config.failSpecWithNoExpectations,
+ nodeStart: function(suite, next) {
+ currentlyExecutingSuites.push(suite);
+ defaultResourcesForRunnable(suite.id, suite.parentSuite.id);
+ reporter.suiteStarted(suite.result, next);
+ suite.startTimer();
+ },
+ nodeComplete: function(suite, result, next) {
+ if (suite !== currentSuite()) {
+ throw new Error('Tried to complete the wrong suite');
+ }
+
+ clearResourcesForRunnable(suite.id);
+ currentlyExecutingSuites.pop();
+
+ if (result.status === 'failed') {
+ hasFailures = true;
+ }
+ suite.endTimer();
+ reporter.suiteDone(result, next);
+ },
+ orderChildren: function(node) {
+ return order.sort(node.children);
+ },
+ excludeNode: function(spec) {
+ return !config.specFilter(spec);
+ }
+ });
+
+ if (!processor.processTree().valid) {
+ throw new Error(
+ 'Invalid order: would cause a beforeAll or afterAll to be run multiple times'
+ );
+ }
+
+ var jasmineTimer = new j$.Timer();
+ jasmineTimer.start();
+
+ var Promise = customPromise || global.Promise;
+
+ if (Promise) {
+ return new Promise(function(resolve) {
+ runAll(function() {
+ if (onComplete) {
+ onComplete();
+ }
+
+ resolve();
+ });
+ });
+ } else {
+ runAll(function() {
+ if (onComplete) {
+ onComplete();
+ }
+ });
+ }
+
+ function runAll(done) {
+ /**
+ * Information passed to the {@link Reporter#jasmineStarted} event.
+ * @typedef JasmineStartedInfo
+ * @property {Int} totalSpecsDefined - The total number of specs defined in this suite.
+ * @property {Order} order - Information about the ordering (random or not) of this execution of the suite.
+ * @since 2.0.0
+ */
+ reporter.jasmineStarted(
+ {
+ totalSpecsDefined: totalSpecsDefined,
+ order: order
+ },
+ function() {
+ currentlyExecutingSuites.push(topSuite);
+
+ processor.execute(function() {
+ clearResourcesForRunnable(topSuite.id);
+ currentlyExecutingSuites.pop();
+ var overallStatus, incompleteReason;
+
+ if (
+ hasFailures ||
+ topSuite.result.failedExpectations.length > 0
+ ) {
+ overallStatus = 'failed';
+ } else if (focusedRunnables.length > 0) {
+ overallStatus = 'incomplete';
+ incompleteReason = 'fit() or fdescribe() was found';
+ } else if (totalSpecsDefined === 0) {
+ overallStatus = 'incomplete';
+ incompleteReason = 'No specs found';
+ } else {
+ overallStatus = 'passed';
+ }
+
+ /**
+ * Information passed to the {@link Reporter#jasmineDone} event.
+ * @typedef JasmineDoneInfo
+ * @property {OverallStatus} overallStatus - The overall result of the suite: 'passed', 'failed', or 'incomplete'.
+ * @property {Int} totalTime - The total time (in ms) that it took to execute the suite
+ * @property {IncompleteReason} incompleteReason - Explanation of why the suite was incomplete.
+ * @property {Order} order - Information about the ordering (random or not) of this execution of the suite.
+ * @property {Expectation[]} failedExpectations - List of expectations that failed in an {@link afterAll} at the global level.
+ * @property {Expectation[]} deprecationWarnings - List of deprecation warnings that occurred at the global level.
+ * @since 2.4.0
+ */
+ reporter.jasmineDone(
+ {
+ overallStatus: overallStatus,
+ totalTime: jasmineTimer.elapsed(),
+ incompleteReason: incompleteReason,
+ order: order,
+ failedExpectations: topSuite.result.failedExpectations,
+ deprecationWarnings: topSuite.result.deprecationWarnings
+ },
+ done
+ );
+ });
+ }
+ );
+ }
+ };
+
+ /**
+ * Add a custom reporter to the Jasmine environment.
+ * @name Env#addReporter
+ * @since 2.0.0
+ * @function
+ * @param {Reporter} reporterToAdd The reporter to be added.
+ * @see custom_reporter
+ */
+ this.addReporter = function(reporterToAdd) {
+ reporter.addReporter(reporterToAdd);
+ };
+
+ /**
+ * Provide a fallback reporter if no other reporters have been specified.
+ * @name Env#provideFallbackReporter
+ * @since 2.5.0
+ * @function
+ * @param {Reporter} reporterToAdd The reporter
+ * @see custom_reporter
+ */
+ this.provideFallbackReporter = function(reporterToAdd) {
+ reporter.provideFallbackReporter(reporterToAdd);
+ };
+
+ /**
+ * Clear all registered reporters
+ * @name Env#clearReporters
+ * @since 2.5.2
+ * @function
+ */
+ this.clearReporters = function() {
+ reporter.clearReporters();
+ };
+
+ var spyFactory = new j$.SpyFactory(
+ function getCustomStrategies() {
+ var runnable = currentRunnable();
+
+ if (runnable) {
+ return runnableResources[runnable.id].customSpyStrategies;
+ }
+
+ return {};
+ },
+ function getDefaultStrategyFn() {
+ var runnable = currentRunnable();
+
+ if (runnable) {
+ return runnableResources[runnable.id].defaultStrategyFn;
+ }
+
+ return undefined;
+ },
+ function getPromise() {
+ return customPromise || global.Promise;
+ }
+ );
+
+ var spyRegistry = new j$.SpyRegistry({
+ currentSpies: function() {
+ if (!currentRunnable()) {
+ throw new Error(
+ 'Spies must be created in a before function or a spec'
+ );
+ }
+ return runnableResources[currentRunnable().id].spies;
+ },
+ createSpy: function(name, originalFn) {
+ return self.createSpy(name, originalFn);
+ }
+ });
+
+ /**
+ * Configures whether Jasmine should allow the same function to be spied on
+ * more than once during the execution of a spec. By default, spying on
+ * a function that is already a spy will cause an error.
+ * @name Env#allowRespy
+ * @function
+ * @since 2.5.0
+ * @param {boolean} allow Whether to allow respying
+ */
+ this.allowRespy = function(allow) {
+ spyRegistry.allowRespy(allow);
+ };
+
+ this.spyOn = function() {
+ return spyRegistry.spyOn.apply(spyRegistry, arguments);
+ };
+
+ this.spyOnProperty = function() {
+ return spyRegistry.spyOnProperty.apply(spyRegistry, arguments);
+ };
+
+ this.spyOnAllFunctions = function() {
+ return spyRegistry.spyOnAllFunctions.apply(spyRegistry, arguments);
+ };
+
+ this.createSpy = function(name, originalFn) {
+ if (arguments.length === 1 && j$.isFunction_(name)) {
+ originalFn = name;
+ name = originalFn.name;
+ }
+
+ return spyFactory.createSpy(name, originalFn);
+ };
+
+ this.createSpyObj = function(baseName, methodNames, propertyNames) {
+ return spyFactory.createSpyObj(baseName, methodNames, propertyNames);
+ };
+
+ var ensureIsFunction = function(fn, caller) {
+ if (!j$.isFunction_(fn)) {
+ throw new Error(
+ caller + ' expects a function argument; received ' + j$.getType_(fn)
+ );
+ }
+ };
+
+ var ensureIsFunctionOrAsync = function(fn, caller) {
+ if (!j$.isFunction_(fn) && !j$.isAsyncFunction_(fn)) {
+ throw new Error(
+ caller + ' expects a function argument; received ' + j$.getType_(fn)
+ );
+ }
+ };
+
+ function ensureIsNotNested(method) {
+ var runnable = currentRunnable();
+ if (runnable !== null && runnable !== undefined) {
+ throw new Error(
+ "'" + method + "' should only be used in 'describe' function"
+ );
+ }
+ }
+
+ var suiteFactory = function(description) {
+ var suite = new j$.Suite({
+ env: self,
+ id: getNextSuiteId(),
+ description: description,
+ parentSuite: currentDeclarationSuite,
+ timer: new j$.Timer(),
+ expectationFactory: expectationFactory,
+ asyncExpectationFactory: suiteAsyncExpectationFactory,
+ expectationResultFactory: expectationResultFactory,
+ throwOnExpectationFailure: config.oneFailurePerSpec,
+ autoCleanClosures: config.autoCleanClosures
+ });
+
+ return suite;
+ };
+
+ this.describe = function(description, specDefinitions) {
- //ensureIsNotNested('describe');
++ ensureIsNotNested('describe');
+ ensureIsFunction(specDefinitions, 'describe');
+ var suite = suiteFactory(description);
+ if (specDefinitions.length > 0) {
+ throw new Error('describe does not expect any arguments');
+ }
+ if (currentDeclarationSuite.markedExcluding) {
+ suite.exclude();
+ }
+ addSpecsToSuite(suite, specDefinitions);
- return suite;
++ if (suite.parentSuite && !suite.children.length) {
++ this.deprecated(
++ 'describe with no children (describe() or it()) is ' +
++ 'deprecated and will be removed in a future version of Jasmine. ' +
++ 'Please either remove the describe or add children to it.'
++ );
++ }
++ return j$.deprecatingSuiteProxy(suite, suite.parentSuite, this);
+ };
+
+ this.xdescribe = function(description, specDefinitions) {
+ ensureIsNotNested('xdescribe');
+ ensureIsFunction(specDefinitions, 'xdescribe');
+ var suite = suiteFactory(description);
+ suite.exclude();
+ addSpecsToSuite(suite, specDefinitions);
- return suite;
++ return j$.deprecatingSuiteProxy(suite, suite.parentSuite, this);
+ };
+
+ var focusedRunnables = [];
+
+ this.fdescribe = function(description, specDefinitions) {
+ ensureIsNotNested('fdescribe');
+ ensureIsFunction(specDefinitions, 'fdescribe');
+ var suite = suiteFactory(description);
+ suite.isFocused = true;
+
+ focusedRunnables.push(suite.id);
+ unfocusAncestor();
+ addSpecsToSuite(suite, specDefinitions);
+
- return suite;
++ return j$.deprecatingSuiteProxy(suite, suite.parentSuite, this);
+ };
+
+ function addSpecsToSuite(suite, specDefinitions) {
+ var parentSuite = currentDeclarationSuite;
+ parentSuite.addChild(suite);
+ currentDeclarationSuite = suite;
+
+ var declarationError = null;
+ try {
- specDefinitions.call(suite);
++ specDefinitions.call(j$.deprecatingThisProxy(suite, self));
+ } catch (e) {
+ declarationError = e;
+ }
+
+ if (declarationError) {
+ suite.onException(declarationError);
+ }
+
+ currentDeclarationSuite = parentSuite;
+ }
+
+ function findFocusedAncestor(suite) {
+ while (suite) {
+ if (suite.isFocused) {
+ return suite.id;
+ }
+ suite = suite.parentSuite;
+ }
+
+ return null;
+ }
+
+ function unfocusAncestor() {
+ var focusedAncestor = findFocusedAncestor(currentDeclarationSuite);
+ if (focusedAncestor) {
+ for (var i = 0; i < focusedRunnables.length; i++) {
+ if (focusedRunnables[i] === focusedAncestor) {
+ focusedRunnables.splice(i, 1);
+ break;
+ }
+ }
+ }
+ }
+
+ var specFactory = function(description, fn, suite, timeout) {
+ totalSpecsDefined++;
+ var spec = new j$.Spec({
+ id: getNextSpecId(),
+ beforeAndAfterFns: beforeAndAfterFns(suite),
+ expectationFactory: expectationFactory,
+ asyncExpectationFactory: specAsyncExpectationFactory,
++ deprecated: self.deprecated,
+ resultCallback: specResultCallback,
+ getSpecName: function(spec) {
+ return getSpecName(spec, suite);
+ },
+ onStart: specStarted,
+ description: description,
+ expectationResultFactory: expectationResultFactory,
+ queueRunnerFactory: queueRunnerFactory,
+ userContext: function() {
+ return suite.clonedSharedUserContext();
+ },
+ queueableFn: {
+ fn: fn,
+ timeout: timeout || 0
+ },
+ throwOnExpectationFailure: config.oneFailurePerSpec,
+ autoCleanClosures: config.autoCleanClosures,
+ timer: new j$.Timer()
+ });
+ return spec;
+
+ function specResultCallback(result, next) {
+ clearResourcesForRunnable(spec.id);
+ currentSpec = null;
+
+ if (result.status === 'failed') {
+ hasFailures = true;
+ }
+
+ reporter.specDone(result, next);
+ }
+
+ function specStarted(spec, next) {
+ currentSpec = spec;
+ defaultResourcesForRunnable(spec.id, suite.id);
+ reporter.specStarted(spec.result, next);
+ }
+ };
+
- this.it = function(description, fn, timeout) {
++ this.it_ = function(description, fn, timeout) {
+ ensureIsNotNested('it');
+ // it() sometimes doesn't have a fn argument, so only check the type if
+ // it's given.
+ if (arguments.length > 1 && typeof fn !== 'undefined') {
+ ensureIsFunctionOrAsync(fn, 'it');
+ }
+
+ if (timeout) {
+ j$.util.validateTimeout(timeout);
+ }
+
+ var spec = specFactory(description, fn, currentDeclarationSuite, timeout);
+ if (currentDeclarationSuite.markedExcluding) {
+ spec.exclude();
+ }
+ currentDeclarationSuite.addChild(spec);
++
+ return spec;
+ };
+
++ this.it = function(description, fn, timeout) {
++ var spec = this.it_(description, fn, timeout);
++ return j$.deprecatingSpecProxy(spec, this);
++ };
++
+ this.xit = function(description, fn, timeout) {
+ ensureIsNotNested('xit');
+ // xit(), like it(), doesn't always have a fn argument, so only check the
+ // type when needed.
+ if (arguments.length > 1 && typeof fn !== 'undefined') {
+ ensureIsFunctionOrAsync(fn, 'xit');
+ }
- var spec = this.it.apply(this, arguments);
++ var spec = this.it_.apply(this, arguments);
+ spec.exclude('Temporarily disabled with xit');
- return spec;
++ return j$.deprecatingSpecProxy(spec, this);
+ };
+
+ this.fit = function(description, fn, timeout) {
+ ensureIsNotNested('fit');
+ ensureIsFunctionOrAsync(fn, 'fit');
+
+ if (timeout) {
+ j$.util.validateTimeout(timeout);
+ }
+ var spec = specFactory(description, fn, currentDeclarationSuite, timeout);
+ currentDeclarationSuite.addChild(spec);
+ focusedRunnables.push(spec.id);
+ unfocusAncestor();
- return spec;
++ return j$.deprecatingSpecProxy(spec, this);
+ };
+
+ /**
+ * Sets a user-defined property that will be provided to reporters as part of the properties field of {@link SpecResult}
+ * @name Env#setSpecProperty
+ * @since 3.6.0
+ * @function
+ * @param {String} key The name of the property
+ * @param {*} value The value of the property
+ */
+ this.setSpecProperty = function(key, value) {
+ if (!currentRunnable() || currentRunnable() == currentSuite()) {
+ throw new Error(
+ "'setSpecProperty' was used when there was no current spec"
+ );
+ }
+ currentRunnable().setSpecProperty(key, value);
+ };
+
+ /**
+ * Sets a user-defined property that will be provided to reporters as part of the properties field of {@link SuiteResult}
+ * @name Env#setSuiteProperty
+ * @since 3.6.0
+ * @function
+ * @param {String} key The name of the property
+ * @param {*} value The value of the property
+ */
+ this.setSuiteProperty = function(key, value) {
+ if (!currentSuite()) {
+ throw new Error(
+ "'setSuiteProperty' was used when there was no current suite"
+ );
+ }
+ currentSuite().setSuiteProperty(key, value);
+ };
+
+ this.expect = function(actual) {
+ if (!currentRunnable()) {
+ throw new Error(
+ "'expect' was used when there was no current spec, this could be because an asynchronous test timed out"
+ );
+ }
+
+ return currentRunnable().expect(actual);
+ };
+
+ this.expectAsync = function(actual) {
+ if (!currentRunnable()) {
+ throw new Error(
+ "'expectAsync' was used when there was no current spec, this could be because an asynchronous test timed out"
+ );
+ }
+
+ return currentRunnable().expectAsync(actual);
+ };
+
+ this.beforeEach = function(beforeEachFunction, timeout) {
+ ensureIsNotNested('beforeEach');
+ ensureIsFunctionOrAsync(beforeEachFunction, 'beforeEach');
+
+ if (timeout) {
+ j$.util.validateTimeout(timeout);
+ }
+
+ currentDeclarationSuite.beforeEach({
+ fn: beforeEachFunction,
+ timeout: timeout || 0
+ });
+ };
+
+ this.beforeAll = function(beforeAllFunction, timeout) {
+ ensureIsNotNested('beforeAll');
+ ensureIsFunctionOrAsync(beforeAllFunction, 'beforeAll');
+
+ if (timeout) {
+ j$.util.validateTimeout(timeout);
+ }
+
+ currentDeclarationSuite.beforeAll({
+ fn: beforeAllFunction,
+ timeout: timeout || 0
+ });
+ };
+
+ this.afterEach = function(afterEachFunction, timeout) {
+ ensureIsNotNested('afterEach');
+ ensureIsFunctionOrAsync(afterEachFunction, 'afterEach');
+
+ if (timeout) {
+ j$.util.validateTimeout(timeout);
+ }
+
+ afterEachFunction.isCleanup = true;
+ currentDeclarationSuite.afterEach({
+ fn: afterEachFunction,
+ timeout: timeout || 0
+ });
+ };
+
+ this.afterAll = function(afterAllFunction, timeout) {
+ ensureIsNotNested('afterAll');
+ ensureIsFunctionOrAsync(afterAllFunction, 'afterAll');
+
+ if (timeout) {
+ j$.util.validateTimeout(timeout);
+ }
+
+ currentDeclarationSuite.afterAll({
+ fn: afterAllFunction,
+ timeout: timeout || 0
+ });
+ };
+
+ this.pending = function(message) {
+ var fullMessage = j$.Spec.pendingSpecExceptionMessage;
+ if (message) {
+ fullMessage += message;
+ }
+ throw fullMessage;
+ };
+
+ this.fail = function(error) {
+ if (!currentRunnable()) {
+ throw new Error(
+ "'fail' was used when there was no current spec, this could be because an asynchronous test timed out"
+ );
+ }
+
+ var message = 'Failed';
+ if (error) {
+ message += ': ';
+ if (error.message) {
+ message += error.message;
+ } else if (j$.isString_(error)) {
+ message += error;
+ } else {
+ // pretty print all kind of objects. This includes arrays.
+ message += makePrettyPrinter()(error);
+ }
+ }
+
+ currentRunnable().addExpectationResult(false, {
+ matcherName: '',
+ passed: false,
+ expected: '',
+ actual: '',
+ message: message,
+ error: error && error.message ? error : null
+ });
+
+ if (config.oneFailurePerSpec) {
+ throw new Error(message);
+ }
+ };
+
+ this.cleanup_ = function() {
+ if (globalErrors) {
+ globalErrors.uninstall();
+ }
+ };
+ }
+
+ return Env;
+};
+
+getJasmineRequireObj().JsApiReporter = function(j$) {
+ /**
+ * @name jsApiReporter
+ * @classdesc {@link Reporter} added by default in `boot.js` to record results for retrieval in javascript code. An instance is made available as `jsApiReporter` on the global object.
+ * @class
+ * @hideconstructor
+ */
+ function JsApiReporter(options) {
+ var timer = options.timer || new j$.Timer(),
+ status = 'loaded';
+
+ this.started = false;
+ this.finished = false;
+ this.runDetails = {};
+
+ this.jasmineStarted = function() {
+ this.started = true;
+ status = 'started';
+ timer.start();
+ };
+
+ var executionTime;
+
+ this.jasmineDone = function(runDetails) {
+ this.finished = true;
+ this.runDetails = runDetails;
+ executionTime = timer.elapsed();
+ status = 'done';
+ };
+
+ /**
+ * Get the current status for the Jasmine environment.
+ * @name jsApiReporter#status
+ * @since 2.0.0
+ * @function
+ * @return {String} - One of `loaded`, `started`, or `done`
+ */
+ this.status = function() {
+ return status;
+ };
+
+ var suites = [],
+ suites_hash = {};
+
+ this.suiteStarted = function(result) {
+ suites_hash[result.id] = result;
+ };
+
+ this.suiteDone = function(result) {
+ storeSuite(result);
+ };
+
+ /**
+ * Get the results for a set of suites.
+ *
+ * Retrievable in slices for easier serialization.
+ * @name jsApiReporter#suiteResults
+ * @since 2.1.0
+ * @function
+ * @param {Number} index - The position in the suites list to start from.
+ * @param {Number} length - Maximum number of suite results to return.
+ * @return {SuiteResult[]}
+ */
+ this.suiteResults = function(index, length) {
+ return suites.slice(index, index + length);
+ };
+
+ function storeSuite(result) {
+ suites.push(result);
+ suites_hash[result.id] = result;
+ }
+
+ /**
+ * Get all of the suites in a single object, with their `id` as the key.
+ * @name jsApiReporter#suites
+ * @since 2.0.0
+ * @function
+ * @return {Object} - Map of suite id to {@link SuiteResult}
+ */
+ this.suites = function() {
+ return suites_hash;
+ };
+
+ var specs = [];
+
+ this.specDone = function(result) {
+ specs.push(result);
+ };
+
+ /**
+ * Get the results for a set of specs.
+ *
+ * Retrievable in slices for easier serialization.
+ * @name jsApiReporter#specResults
+ * @since 2.0.0
+ * @function
+ * @param {Number} index - The position in the specs list to start from.
+ * @param {Number} length - Maximum number of specs results to return.
+ * @return {SpecResult[]}
+ */
+ this.specResults = function(index, length) {
+ return specs.slice(index, index + length);
+ };
+
+ /**
+ * Get all spec results.
+ * @name jsApiReporter#specs
+ * @since 2.0.0
+ * @function
+ * @return {SpecResult[]}
+ */
+ this.specs = function() {
+ return specs;
+ };
+
+ /**
+ * Get the number of milliseconds it took for the full Jasmine suite to run.
+ * @name jsApiReporter#executionTime
+ * @since 2.0.0
+ * @function
+ * @return {Number}
+ */
+ this.executionTime = function() {
+ return executionTime;
+ };
+ }
+
+ return JsApiReporter;
+};
+
+getJasmineRequireObj().Any = function(j$) {
+ function Any(expectedObject) {
+ if (typeof expectedObject === 'undefined') {
+ throw new TypeError(
+ 'jasmine.any() expects to be passed a constructor function. ' +
+ 'Please pass one or use jasmine.anything() to match any object.'
+ );
+ }
+ this.expectedObject = expectedObject;
+ }
+
+ Any.prototype.asymmetricMatch = function(other) {
+ if (this.expectedObject == String) {
+ return typeof other == 'string' || other instanceof String;
+ }
+
+ if (this.expectedObject == Number) {
+ return typeof other == 'number' || other instanceof Number;
+ }
+
+ if (this.expectedObject == Function) {
+ return typeof other == 'function' || other instanceof Function;
+ }
+
+ if (this.expectedObject == Object) {
+ return other !== null && typeof other == 'object';
+ }
+
+ if (this.expectedObject == Boolean) {
+ return typeof other == 'boolean';
+ }
+
+ /* jshint -W122 */
+ /* global Symbol */
+ if (typeof Symbol != 'undefined' && this.expectedObject == Symbol) {
+ return typeof other == 'symbol';
+ }
+ /* jshint +W122 */
+
+ return other instanceof this.expectedObject;
+ };
+
+ Any.prototype.jasmineToString = function() {
+ return '<jasmine.any(' + j$.fnNameFor(this.expectedObject) + ')>';
+ };
+
+ return Any;
+};
+
+getJasmineRequireObj().Anything = function(j$) {
+ function Anything() {}
+
+ Anything.prototype.asymmetricMatch = function(other) {
+ return !j$.util.isUndefined(other) && other !== null;
+ };
+
+ Anything.prototype.jasmineToString = function() {
+ return '<jasmine.anything>';
+ };
+
+ return Anything;
+};
+
+getJasmineRequireObj().ArrayContaining = function(j$) {
+ function ArrayContaining(sample) {
+ this.sample = sample;
+ }
+
+ ArrayContaining.prototype.asymmetricMatch = function(other, matchersUtil) {
+ if (!j$.isArray_(this.sample)) {
+ throw new Error(
+ 'You must provide an array to arrayContaining, not ' +
- j$.pp(this.sample) +
++ j$.basicPrettyPrinter_(this.sample) +
+ '.'
+ );
+ }
+
+ // If the actual parameter is not an array, we can fail immediately, since it couldn't
+ // possibly be an "array containing" anything. However, we also want an empty sample
+ // array to match anything, so we need to double-check we aren't in that case
+ if (!j$.isArray_(other) && this.sample.length > 0) {
+ return false;
+ }
+
+ for (var i = 0; i < this.sample.length; i++) {
+ var item = this.sample[i];
+ if (!matchersUtil.contains(other, item)) {
+ return false;
+ }
+ }
+
+ return true;
+ };
+
+ ArrayContaining.prototype.jasmineToString = function(pp) {
+ return '<jasmine.arrayContaining(' + pp(this.sample) + ')>';
+ };
+
+ return ArrayContaining;
+};
+
+getJasmineRequireObj().ArrayWithExactContents = function(j$) {
+ function ArrayWithExactContents(sample) {
+ this.sample = sample;
+ }
+
+ ArrayWithExactContents.prototype.asymmetricMatch = function(
+ other,
+ matchersUtil
+ ) {
+ if (!j$.isArray_(this.sample)) {
+ throw new Error(
+ 'You must provide an array to arrayWithExactContents, not ' +
- j$.pp(this.sample) +
++ j$.basicPrettyPrinter_(this.sample) +
+ '.'
+ );
+ }
+
+ if (this.sample.length !== other.length) {
+ return false;
+ }
+
+ for (var i = 0; i < this.sample.length; i++) {
+ var item = this.sample[i];
+ if (!matchersUtil.contains(other, item)) {
+ return false;
+ }
+ }
+
+ return true;
+ };
+
+ ArrayWithExactContents.prototype.jasmineToString = function(pp) {
+ return '<jasmine.arrayWithExactContents(' + pp(this.sample) + ')>';
+ };
+
+ return ArrayWithExactContents;
+};
+
+getJasmineRequireObj().Empty = function(j$) {
+ function Empty() {}
+
+ Empty.prototype.asymmetricMatch = function(other) {
+ if (j$.isString_(other) || j$.isArray_(other) || j$.isTypedArray_(other)) {
+ return other.length === 0;
+ }
+
+ if (j$.isMap(other) || j$.isSet(other)) {
+ return other.size === 0;
+ }
+
+ if (j$.isObject_(other)) {
+ return Object.keys(other).length === 0;
+ }
+ return false;
+ };
+
+ Empty.prototype.jasmineToString = function() {
+ return '<jasmine.empty>';
+ };
+
+ return Empty;
+};
+
+getJasmineRequireObj().Falsy = function(j$) {
+ function Falsy() {}
+
+ Falsy.prototype.asymmetricMatch = function(other) {
+ return !other;
+ };
+
+ Falsy.prototype.jasmineToString = function() {
+ return '<jasmine.falsy>';
+ };
+
+ return Falsy;
+};
+
+getJasmineRequireObj().MapContaining = function(j$) {
+ function MapContaining(sample) {
+ if (!j$.isMap(sample)) {
+ throw new Error(
- 'You must provide a map to `mapContaining`, not ' + j$.pp(sample)
++ 'You must provide a map to `mapContaining`, not ' +
++ j$.basicPrettyPrinter_(sample)
+ );
+ }
+
+ this.sample = sample;
+ }
+
+ MapContaining.prototype.asymmetricMatch = function(other, matchersUtil) {
+ if (!j$.isMap(other)) return false;
+
+ var hasAllMatches = true;
+ j$.util.forEachBreakable(this.sample, function(breakLoop, value, key) {
+ // for each key/value pair in `sample`
+ // there should be at least one pair in `other` whose key and value both match
+ var hasMatch = false;
+ j$.util.forEachBreakable(other, function(oBreakLoop, oValue, oKey) {
+ if (
+ matchersUtil.equals(oKey, key) &&
+ matchersUtil.equals(oValue, value)
+ ) {
+ hasMatch = true;
+ oBreakLoop();
+ }
+ });
+ if (!hasMatch) {
+ hasAllMatches = false;
+ breakLoop();
+ }
+ });
+
+ return hasAllMatches;
+ };
+
+ MapContaining.prototype.jasmineToString = function(pp) {
+ return '<jasmine.mapContaining(' + pp(this.sample) + ')>';
+ };
+
+ return MapContaining;
+};
+
+getJasmineRequireObj().NotEmpty = function(j$) {
+ function NotEmpty() {}
+
+ NotEmpty.prototype.asymmetricMatch = function(other) {
+ if (j$.isString_(other) || j$.isArray_(other) || j$.isTypedArray_(other)) {
+ return other.length !== 0;
+ }
+
+ if (j$.isMap(other) || j$.isSet(other)) {
+ return other.size !== 0;
+ }
+
+ if (j$.isObject_(other)) {
+ return Object.keys(other).length !== 0;
+ }
+
+ return false;
+ };
+
+ NotEmpty.prototype.jasmineToString = function() {
+ return '<jasmine.notEmpty>';
+ };
+
+ return NotEmpty;
+};
+
+getJasmineRequireObj().ObjectContaining = function(j$) {
+ function ObjectContaining(sample) {
+ this.sample = sample;
+ }
+
+ function getPrototype(obj) {
+ if (Object.getPrototypeOf) {
+ return Object.getPrototypeOf(obj);
+ }
+
+ if (obj.constructor.prototype == obj) {
+ return null;
+ }
+
+ return obj.constructor.prototype;
+ }
+
+ function hasProperty(obj, property) {
+ if (!obj || typeof obj !== 'object') {
+ return false;
+ }
+
+ if (Object.prototype.hasOwnProperty.call(obj, property)) {
+ return true;
+ }
+
+ return hasProperty(getPrototype(obj), property);
+ }
+
+ ObjectContaining.prototype.asymmetricMatch = function(other, matchersUtil) {
+ if (typeof this.sample !== 'object') {
+ throw new Error(
+ "You must provide an object to objectContaining, not '" +
+ this.sample +
+ "'."
+ );
+ }
+ if (typeof other !== 'object') {
+ return false;
+ }
+
+ for (var property in this.sample) {
+ if (
+ !hasProperty(other, property) ||
+ !matchersUtil.equals(this.sample[property], other[property])
+ ) {
+ return false;
+ }
+ }
+
+ return true;
+ };
+
+ ObjectContaining.prototype.valuesForDiff_ = function(other, pp) {
+ if (!j$.isObject_(other)) {
+ return {
+ self: this.jasmineToString(pp),
+ other: other
+ };
+ }
+
+ var filteredOther = {};
+ Object.keys(this.sample).forEach(function(k) {
+ // eq short-circuits comparison of objects that have different key sets,
+ // so include all keys even if undefined.
+ filteredOther[k] = other[k];
+ });
+
+ return {
+ self: this.sample,
+ other: filteredOther
+ };
+ };
+
+ ObjectContaining.prototype.jasmineToString = function(pp) {
+ return '<jasmine.objectContaining(' + pp(this.sample) + ')>';
+ };
+
+ return ObjectContaining;
+};
+
+getJasmineRequireObj().SetContaining = function(j$) {
+ function SetContaining(sample) {
+ if (!j$.isSet(sample)) {
+ throw new Error(
- 'You must provide a set to `setContaining`, not ' + j$.pp(sample)
++ 'You must provide a set to `setContaining`, not ' +
++ j$.basicPrettyPrinter_(sample)
+ );
+ }
+
+ this.sample = sample;
+ }
+
+ SetContaining.prototype.asymmetricMatch = function(other, matchersUtil) {
+ if (!j$.isSet(other)) return false;
+
+ var hasAllMatches = true;
+ j$.util.forEachBreakable(this.sample, function(breakLoop, item) {
+ // for each item in `sample` there should be at least one matching item in `other`
+ // (not using `matchersUtil.contains` because it compares set members by reference,
+ // not by deep value equality)
+ var hasMatch = false;
+ j$.util.forEachBreakable(other, function(oBreakLoop, oItem) {
+ if (matchersUtil.equals(oItem, item)) {
+ hasMatch = true;
+ oBreakLoop();
+ }
+ });
+ if (!hasMatch) {
+ hasAllMatches = false;
+ breakLoop();
+ }
+ });
+
+ return hasAllMatches;
+ };
+
+ SetContaining.prototype.jasmineToString = function(pp) {
+ return '<jasmine.setContaining(' + pp(this.sample) + ')>';
+ };
+
+ return SetContaining;
+};
+
+getJasmineRequireObj().StringContaining = function(j$) {
+ function StringContaining(expected) {
+ if (!j$.isString_(expected)) {
+ throw new Error('Expected is not a String');
+ }
+
+ this.expected = expected;
+ }
+
+ StringContaining.prototype.asymmetricMatch = function(other) {
+ if (!j$.isString_(other)) {
+ // Arrays, etc. don't match no matter what their indexOf returns.
+ return false;
+ }
+
+ return other.indexOf(this.expected) !== -1;
+ };
+
+ StringContaining.prototype.jasmineToString = function() {
+ return '<jasmine.stringContaining("' + this.expected + '")>';
+ };
+
+ return StringContaining;
+};
+
+getJasmineRequireObj().StringMatching = function(j$) {
+ function StringMatching(expected) {
+ if (!j$.isString_(expected) && !j$.isA_('RegExp', expected)) {
+ throw new Error('Expected is not a String or a RegExp');
+ }
+
+ this.regexp = new RegExp(expected);
+ }
+
+ StringMatching.prototype.asymmetricMatch = function(other) {
+ return this.regexp.test(other);
+ };
+
+ StringMatching.prototype.jasmineToString = function() {
+ return '<jasmine.stringMatching(' + this.regexp + ')>';
+ };
+
+ return StringMatching;
+};
+
+getJasmineRequireObj().Truthy = function(j$) {
+ function Truthy() {}
+
+ Truthy.prototype.asymmetricMatch = function(other) {
+ return !!other;
+ };
+
+ Truthy.prototype.jasmineToString = function() {
+ return '<jasmine.truthy>';
+ };
+
+ return Truthy;
+};
+
+getJasmineRequireObj().asymmetricEqualityTesterArgCompatShim = function(j$) {
+ /*
+ Older versions of Jasmine passed an array of custom equality testers as the
+ second argument to each asymmetric equality tester's `asymmetricMatch`
+ method. Newer versions will pass a `MatchersUtil` instance. The
+ asymmetricEqualityTesterArgCompatShim allows for a graceful migration from
+ the old interface to the new by "being" both an array of custom equality
+ testers and a `MatchersUtil` at the same time.
+
+ This code should be removed in the next major release.
+ */
+
+ var likelyArrayProps = [
+ 'concat',
+ 'constructor',
+ 'copyWithin',
+ 'entries',
+ 'every',
+ 'fill',
+ 'filter',
+ 'find',
+ 'findIndex',
+ 'flat',
+ 'flatMap',
+ 'forEach',
+ 'includes',
+ 'indexOf',
+ 'join',
+ 'keys',
+ 'lastIndexOf',
+ 'length',
+ 'map',
+ 'pop',
+ 'push',
+ 'reduce',
+ 'reduceRight',
+ 'reverse',
+ 'shift',
+ 'slice',
+ 'some',
+ 'sort',
+ 'splice',
+ 'toLocaleString',
+ 'toSource',
+ 'toString',
+ 'unshift',
+ 'values'
+ ];
+
+ function asymmetricEqualityTesterArgCompatShim(
+ matchersUtil,
+ customEqualityTesters
+ ) {
- var self = Object.create(matchersUtil),
- props,
- i,
- k;
++ var self = Object.create(matchersUtil);
+
- copy(self, customEqualityTesters, 'length');
++ copyAndDeprecate(self, customEqualityTesters, 'length');
+
+ for (i = 0; i < customEqualityTesters.length; i++) {
- copy(self, customEqualityTesters, i);
++ copyAndDeprecate(self, customEqualityTesters, i);
+ }
+
- var props = arrayProps();
++ // Avoid copying array props if we've previously done so,
++ // to avoid triggering our own deprecation warnings.
++ if (!self.isAsymmetricEqualityTesterArgCompatShim_) {
++ copyAndDeprecateArrayMethods(self);
++ }
++
++ self.isAsymmetricEqualityTesterArgCompatShim_ = true;
++ return self;
++ }
++
++ function copyAndDeprecateArrayMethods(dest) {
++ var props = arrayProps(),
++ i,
++ k;
+
+ for (i = 0; i < props.length; i++) {
+ k = props[i];
++
+ // Skip length (dealt with above), and anything that collides with
+ // MatchesUtil e.g. an Array.prototype.contains method added by user code
- if (k !== 'length' && !self[k]) {
- copy(self, Array.prototype, k);
++ if (k !== 'length' && !dest[k]) {
++ copyAndDeprecate(dest, Array.prototype, k);
+ }
+ }
-
- return self;
+ }
+
- function copy(dest, src, propName) {
++ function copyAndDeprecate(dest, src, propName) {
+ Object.defineProperty(dest, propName, {
+ get: function() {
++ j$.getEnv().deprecated(
++ 'The second argument to asymmetricMatch is now a ' +
++ 'MatchersUtil. Using it as an array of custom equality testers is ' +
++ 'deprecated and will stop working in a future release. ' +
++ 'See <https://jasmine.github.io/tutorials/upgrading_to_Jasmine_4.0#asymmetricMatch-cet> for details.'
++ );
+ return src[propName];
+ }
+ });
+ }
+
+ function arrayProps() {
+ var props, a, k;
+
+ if (!Object.getOwnPropertyDescriptors) {
+ return likelyArrayProps.filter(function(k) {
+ return Array.prototype.hasOwnProperty(k);
+ });
+ }
+
+ props = Object.getOwnPropertyDescriptors(Array.prototype); // eslint-disable-line compat/compat
+ a = [];
+
+ for (k in props) {
+ a.push(k);
+ }
+
+ return a;
+ }
+
+ return asymmetricEqualityTesterArgCompatShim;
+};
+
+getJasmineRequireObj().CallTracker = function(j$) {
+ /**
+ * @namespace Spy#calls
+ * @since 2.0.0
+ */
+ function CallTracker() {
+ var calls = [];
+ var opts = {};
+
+ this.track = function(context) {
+ if (opts.cloneArgs) {
+ context.args = j$.util.cloneArgs(context.args);
+ }
+ calls.push(context);
+ };
+
+ /**
+ * Check whether this spy has been invoked.
+ * @name Spy#calls#any
+ * @since 2.0.0
+ * @function
+ * @return {Boolean}
+ */
+ this.any = function() {
+ return !!calls.length;
+ };
+
+ /**
+ * Get the number of invocations of this spy.
+ * @name Spy#calls#count
+ * @since 2.0.0
+ * @function
+ * @return {Integer}
+ */
+ this.count = function() {
+ return calls.length;
+ };
+
+ /**
+ * Get the arguments that were passed to a specific invocation of this spy.
+ * @name Spy#calls#argsFor
+ * @since 2.0.0
+ * @function
+ * @param {Integer} index The 0-based invocation index.
+ * @return {Array}
+ */
+ this.argsFor = function(index) {
+ var call = calls[index];
+ return call ? call.args : [];
+ };
+
+ /**
+ * Get the "this" object that was passed to a specific invocation of this spy.
+ * @name Spy#calls#thisFor
+ * @since 3.8.0
+ * @function
+ * @param {Integer} index The 0-based invocation index.
+ * @return {Object?}
+ */
+ this.thisFor = function(index) {
+ var call = calls[index];
+ return call ? call.object : undefined;
+ };
+
+ /**
+ * Get the raw calls array for this spy.
+ * @name Spy#calls#all
+ * @since 2.0.0
+ * @function
+ * @return {Spy.callData[]}
+ */
+ this.all = function() {
+ return calls;
+ };
+
+ /**
+ * Get all of the arguments for each invocation of this spy in the order they were received.
+ * @name Spy#calls#allArgs
+ * @since 2.0.0
+ * @function
+ * @return {Array}
+ */
+ this.allArgs = function() {
+ var callArgs = [];
+ for (var i = 0; i < calls.length; i++) {
+ callArgs.push(calls[i].args);
+ }
+
+ return callArgs;
+ };
+
+ /**
+ * Get the first invocation of this spy.
+ * @name Spy#calls#first
+ * @since 2.0.0
+ * @function
+ * @return {ObjecSpy.callData}
+ */
+ this.first = function() {
+ return calls[0];
+ };
+
+ /**
+ * Get the most recent invocation of this spy.
+ * @name Spy#calls#mostRecent
+ * @since 2.0.0
+ * @function
+ * @return {ObjecSpy.callData}
+ */
+ this.mostRecent = function() {
+ return calls[calls.length - 1];
+ };
+
+ /**
+ * Reset this spy as if it has never been called.
+ * @name Spy#calls#reset
+ * @since 2.0.0
+ * @function
+ */
+ this.reset = function() {
+ calls = [];
+ };
+
+ /**
+ * Set this spy to do a shallow clone of arguments passed to each invocation.
+ * @name Spy#calls#saveArgumentsByValue
+ * @since 2.5.0
+ * @function
+ */
+ this.saveArgumentsByValue = function() {
+ opts.cloneArgs = true;
+ };
+ }
+
+ return CallTracker;
+};
+
+getJasmineRequireObj().clearStack = function(j$) {
+ var maxInlineCallCount = 10;
+
+ function messageChannelImpl(global, setTimeout) {
+ var channel = new global.MessageChannel(),
+ head = {},
+ tail = head;
+
+ var taskRunning = false;
+ channel.port1.onmessage = function() {
+ head = head.next;
+ var task = head.task;
+ delete head.task;
+
+ if (taskRunning) {
+ global.setTimeout(task, 0);
+ } else {
+ try {
+ taskRunning = true;
+ task();
+ } finally {
+ taskRunning = false;
+ }
+ }
+ };
+
+ var currentCallCount = 0;
+ return function clearStack(fn) {
+ currentCallCount++;
+
+ if (currentCallCount < maxInlineCallCount) {
+ tail = tail.next = { task: fn };
+ channel.port2.postMessage(0);
+ } else {
+ currentCallCount = 0;
+ setTimeout(fn);
+ }
+ };
+ }
+
+ function getClearStack(global) {
+ var currentCallCount = 0;
+ var realSetTimeout = global.setTimeout;
+ var setTimeoutImpl = function clearStack(fn) {
+ Function.prototype.apply.apply(realSetTimeout, [global, [fn, 0]]);
+ };
+
+ if (j$.isFunction_(global.setImmediate)) {
+ var realSetImmediate = global.setImmediate;
+ return function(fn) {
+ currentCallCount++;
+
+ if (currentCallCount < maxInlineCallCount) {
+ realSetImmediate(fn);
+ } else {
+ currentCallCount = 0;
+
+ setTimeoutImpl(fn);
+ }
+ };
+ } else if (!j$.util.isUndefined(global.MessageChannel)) {
+ return messageChannelImpl(global, setTimeoutImpl);
+ } else {
+ return setTimeoutImpl;
+ }
+ }
+
+ return getClearStack;
+};
+
+getJasmineRequireObj().Clock = function() {
+ /* global process */
+ var NODE_JS =
+ typeof process !== 'undefined' &&
+ process.versions &&
+ typeof process.versions.node === 'string';
+
+ /**
+ * @class Clock
+ * @since 1.3.0
+ * @classdesc Jasmine's mock clock is used when testing time dependent code.<br>
+ * _Note:_ Do not construct this directly. You can get the current clock with
+ * {@link jasmine.clock}.
+ * @hideconstructor
+ */
+ function Clock(global, delayedFunctionSchedulerFactory, mockDate) {
+ var self = this,
+ realTimingFunctions = {
+ setTimeout: global.setTimeout,
+ clearTimeout: global.clearTimeout,
+ setInterval: global.setInterval,
+ clearInterval: global.clearInterval
+ },
+ fakeTimingFunctions = {
+ setTimeout: setTimeout,
+ clearTimeout: clearTimeout,
+ setInterval: setInterval,
+ clearInterval: clearInterval
+ },
+ installed = false,
+ delayedFunctionScheduler,
+ timer;
+
+ self.FakeTimeout = FakeTimeout;
+
+ /**
+ * Install the mock clock over the built-in methods.
+ * @name Clock#install
+ * @since 2.0.0
+ * @function
+ * @return {Clock}
+ */
+ self.install = function() {
+ if (!originalTimingFunctionsIntact()) {
+ throw new Error(
+ 'Jasmine Clock was unable to install over custom global timer functions. Is the clock already installed?'
+ );
+ }
+ replace(global, fakeTimingFunctions);
+ timer = fakeTimingFunctions;
+ delayedFunctionScheduler = delayedFunctionSchedulerFactory();
+ installed = true;
+
+ return self;
+ };
+
+ /**
+ * Uninstall the mock clock, returning the built-in methods to their places.
+ * @name Clock#uninstall
+ * @since 2.0.0
+ * @function
+ */
+ self.uninstall = function() {
+ delayedFunctionScheduler = null;
+ mockDate.uninstall();
+ replace(global, realTimingFunctions);
+
+ timer = realTimingFunctions;
+ installed = false;
+ };
+
+ /**
+ * Execute a function with a mocked Clock
+ *
+ * The clock will be {@link Clock#install|install}ed before the function is called and {@link Clock#uninstall|uninstall}ed in a `finally` after the function completes.
+ * @name Clock#withMock
+ * @since 2.3.0
+ * @function
+ * @param {Function} closure The function to be called.
+ */
+ self.withMock = function(closure) {
+ this.install();
+ try {
+ closure();
+ } finally {
+ this.uninstall();
+ }
+ };
+
+ /**
+ * Instruct the installed Clock to also mock the date returned by `new Date()`
+ * @name Clock#mockDate
+ * @since 2.1.0
+ * @function
+ * @param {Date} [initialDate=now] The `Date` to provide.
+ */
+ self.mockDate = function(initialDate) {
+ mockDate.install(initialDate);
+ };
+
+ self.setTimeout = function(fn, delay, params) {
+ return Function.prototype.apply.apply(timer.setTimeout, [
+ global,
+ arguments
+ ]);
+ };
+
+ self.setInterval = function(fn, delay, params) {
+ return Function.prototype.apply.apply(timer.setInterval, [
+ global,
+ arguments
+ ]);
+ };
+
+ self.clearTimeout = function(id) {
+ return Function.prototype.call.apply(timer.clearTimeout, [global, id]);
+ };
+
+ self.clearInterval = function(id) {
+ return Function.prototype.call.apply(timer.clearInterval, [global, id]);
+ };
+
+ /**
+ * Tick the Clock forward, running any enqueued timeouts along the way
+ * @name Clock#tick
+ * @since 1.3.0
+ * @function
+ * @param {int} millis The number of milliseconds to tick.
+ */
+ self.tick = function(millis) {
+ if (installed) {
+ delayedFunctionScheduler.tick(millis, function(millis) {
+ mockDate.tick(millis);
+ });
+ } else {
+ throw new Error(
+ 'Mock clock is not installed, use jasmine.clock().install()'
+ );
+ }
+ };
+
+ return self;
+
+ function originalTimingFunctionsIntact() {
+ return (
+ global.setTimeout === realTimingFunctions.setTimeout &&
+ global.clearTimeout === realTimingFunctions.clearTimeout &&
+ global.setInterval === realTimingFunctions.setInterval &&
+ global.clearInterval === realTimingFunctions.clearInterval
+ );
+ }
+
+ function replace(dest, source) {
+ for (var prop in source) {
+ dest[prop] = source[prop];
+ }
+ }
+
+ function setTimeout(fn, delay) {
+ if (!NODE_JS) {
+ return delayedFunctionScheduler.scheduleFunction(
+ fn,
+ delay,
+ argSlice(arguments, 2)
+ );
+ }
+
+ var timeout = new FakeTimeout();
+
+ delayedFunctionScheduler.scheduleFunction(
+ fn,
+ delay,
+ argSlice(arguments, 2),
+ false,
+ timeout
+ );
+
+ return timeout;
+ }
+
+ function clearTimeout(id) {
+ return delayedFunctionScheduler.removeFunctionWithId(id);
+ }
+
+ function setInterval(fn, interval) {
+ if (!NODE_JS) {
+ return delayedFunctionScheduler.scheduleFunction(
+ fn,
+ interval,
+ argSlice(arguments, 2),
+ true
+ );
+ }
+
+ var timeout = new FakeTimeout();
+
+ delayedFunctionScheduler.scheduleFunction(
+ fn,
+ interval,
+ argSlice(arguments, 2),
+ true,
+ timeout
+ );
+
+ return timeout;
+ }
+
+ function clearInterval(id) {
+ return delayedFunctionScheduler.removeFunctionWithId(id);
+ }
+
+ function argSlice(argsObj, n) {
+ return Array.prototype.slice.call(argsObj, n);
+ }
+ }
+
+ /**
+ * Mocks Node.js Timeout class
+ */
+ function FakeTimeout() {}
+
+ FakeTimeout.prototype.ref = function() {
+ return this;
+ };
+
+ FakeTimeout.prototype.unref = function() {
+ return this;
+ };
+
+ return Clock;
+};
+
+getJasmineRequireObj().DelayedFunctionScheduler = function(j$) {
+ function DelayedFunctionScheduler() {
+ var self = this;
+ var scheduledLookup = [];
+ var scheduledFunctions = {};
+ var currentTime = 0;
+ var delayedFnCount = 0;
+ var deletedKeys = [];
++ var ticking = false;
+
+ self.tick = function(millis, tickDate) {
- millis = millis || 0;
- var endTime = currentTime + millis;
++ if (ticking) {
++ j$.getEnv().deprecated(
++ 'The behavior of reentrant calls to jasmine.clock().tick() will ' +
++ 'change in a future version. Either modify the affected spec to ' +
++ 'not call tick() from within a setTimeout or setInterval handler, ' +
++ 'or be aware that it may behave differently in the future. See ' +
++ '<https://jasmine.github.io/tutorials/upgrading_to_Jasmine_4.0#deprecations-due-to-reentrant-calls-to-jasmine-clock-tick> ' +
++ 'for details.'
++ );
++ }
++
++ ticking = true;
++
++ try {
++ millis = millis || 0;
++ var endTime = currentTime + millis;
+
- runScheduledFunctions(endTime, tickDate);
- currentTime = endTime;
++ runScheduledFunctions(endTime, tickDate);
++ currentTime = endTime;
++ } finally {
++ ticking = false;
++ }
+ };
+
+ self.scheduleFunction = function(
+ funcToCall,
+ millis,
+ params,
+ recurring,
+ timeoutKey,
+ runAtMillis
+ ) {
+ var f;
+ if (typeof funcToCall === 'string') {
+ /* jshint evil: true */
+ f = function() {
+ return eval(funcToCall);
+ };
+ /* jshint evil: false */
+ } else {
+ f = funcToCall;
+ }
+
+ millis = millis || 0;
+ timeoutKey = timeoutKey || ++delayedFnCount;
+ runAtMillis = runAtMillis || currentTime + millis;
+
+ var funcToSchedule = {
+ runAtMillis: runAtMillis,
+ funcToCall: f,
+ recurring: recurring,
+ params: params,
+ timeoutKey: timeoutKey,
+ millis: millis
+ };
+
+ if (runAtMillis in scheduledFunctions) {
+ scheduledFunctions[runAtMillis].push(funcToSchedule);
+ } else {
+ scheduledFunctions[runAtMillis] = [funcToSchedule];
+ scheduledLookup.push(runAtMillis);
+ scheduledLookup.sort(function(a, b) {
+ return a - b;
+ });
+ }
+
+ return timeoutKey;
+ };
+
+ self.removeFunctionWithId = function(timeoutKey) {
+ deletedKeys.push(timeoutKey);
+
+ for (var runAtMillis in scheduledFunctions) {
+ var funcs = scheduledFunctions[runAtMillis];
+ var i = indexOfFirstToPass(funcs, function(func) {
+ return func.timeoutKey === timeoutKey;
+ });
+
+ if (i > -1) {
+ if (funcs.length === 1) {
+ delete scheduledFunctions[runAtMillis];
+ deleteFromLookup(runAtMillis);
+ } else {
+ funcs.splice(i, 1);
+ }
+
+ // intervals get rescheduled when executed, so there's never more
+ // than a single scheduled function with a given timeoutKey
+ break;
+ }
+ }
+ };
+
+ return self;
+
+ function indexOfFirstToPass(array, testFn) {
+ var index = -1;
+
+ for (var i = 0; i < array.length; ++i) {
+ if (testFn(array[i])) {
+ index = i;
+ break;
+ }
+ }
+
+ return index;
+ }
+
+ function deleteFromLookup(key) {
+ var value = Number(key);
+ var i = indexOfFirstToPass(scheduledLookup, function(millis) {
+ return millis === value;
+ });
+
+ if (i > -1) {
+ scheduledLookup.splice(i, 1);
+ }
+ }
+
+ function reschedule(scheduledFn) {
+ self.scheduleFunction(
+ scheduledFn.funcToCall,
+ scheduledFn.millis,
+ scheduledFn.params,
+ true,
+ scheduledFn.timeoutKey,
+ scheduledFn.runAtMillis + scheduledFn.millis
+ );
+ }
+
+ function forEachFunction(funcsToRun, callback) {
+ for (var i = 0; i < funcsToRun.length; ++i) {
+ callback(funcsToRun[i]);
+ }
+ }
+
+ function runScheduledFunctions(endTime, tickDate) {
+ tickDate = tickDate || function() {};
+ if (scheduledLookup.length === 0 || scheduledLookup[0] > endTime) {
+ tickDate(endTime - currentTime);
+ return;
+ }
+
+ do {
+ deletedKeys = [];
+ var newCurrentTime = scheduledLookup.shift();
+ tickDate(newCurrentTime - currentTime);
+
+ currentTime = newCurrentTime;
+
+ var funcsToRun = scheduledFunctions[currentTime];
+
+ delete scheduledFunctions[currentTime];
+
+ forEachFunction(funcsToRun, function(funcToRun) {
+ if (funcToRun.recurring) {
+ reschedule(funcToRun);
+ }
+ });
+
+ forEachFunction(funcsToRun, function(funcToRun) {
+ if (j$.util.arrayContains(deletedKeys, funcToRun.timeoutKey)) {
+ // skip a timeoutKey deleted whilst we were running
+ return;
+ }
+ funcToRun.funcToCall.apply(null, funcToRun.params || []);
+ });
+ deletedKeys = [];
+ } while (
+ scheduledLookup.length > 0 &&
+ // checking first if we're out of time prevents setTimeout(0)
+ // scheduled in a funcToRun from forcing an extra iteration
+ currentTime !== endTime &&
+ scheduledLookup[0] <= endTime
+ );
+
+ // ran out of functions to call, but still time left on the clock
+ if (currentTime !== endTime) {
+ tickDate(endTime - currentTime);
+ }
+ }
+ }
+
+ return DelayedFunctionScheduler;
+};
+
++/* eslint-disable compat/compat */
++// TODO: Remove this in the next major release.
++getJasmineRequireObj().deprecatingSpecProxy = function(j$) {
++ function isMember(target, prop) {
++ return (
++ Object.keys(target).indexOf(prop) !== -1 ||
++ Object.keys(j$.Spec.prototype).indexOf(prop) !== -1
++ );
++ }
++
++ function isAllowedMember(prop) {
++ return prop === 'id' || prop === 'description' || prop === 'getFullName';
++ }
++
++ function msg(member) {
++ var memberName = member.toString().replace(/^Symbol\((.+)\)$/, '$1');
++ return (
++ 'Access to private Spec members (in this case `' +
++ memberName +
++ '`) is not supported and will break in ' +
++ 'a future release. See <https://jasmine.github.io/api/edge/Spec.html> ' +
++ 'for correct usage.'
++ );
++ }
++
++ try {
++ new Proxy({}, {});
++ } catch (e) {
++ // Environment does not support Poxy.
++ return function(spec) {
++ return spec;
++ };
++ }
++
++ function DeprecatingSpecProxyHandler(env) {
++ this._env = env;
++ }
++
++ DeprecatingSpecProxyHandler.prototype.get = function(target, prop, receiver) {
++ this._maybeDeprecate(target, prop);
++
++ if (prop === 'getFullName') {
++ // getFullName calls a private method. Re-bind 'this' to avoid a bogus
++ // deprecation warning.
++ return target.getFullName.bind(target);
++ } else {
++ return target[prop];
++ }
++ };
++
++ DeprecatingSpecProxyHandler.prototype.set = function(target, prop, value) {
++ this._maybeDeprecate(target, prop);
++ return (target[prop] = value);
++ };
++
++ DeprecatingSpecProxyHandler.prototype._maybeDeprecate = function(
++ target,
++ prop
++ ) {
++ if (isMember(target, prop) && !isAllowedMember(prop)) {
++ this._env.deprecated(msg(prop));
++ }
++ };
++
++ function deprecatingSpecProxy(spec, env) {
++ return new Proxy(spec, new DeprecatingSpecProxyHandler(env));
++ }
++
++ return deprecatingSpecProxy;
++};
++
++/* eslint-disable compat/compat */
++// TODO: Remove this in the next major release.
++getJasmineRequireObj().deprecatingSuiteProxy = function(j$) {
++ var allowedMembers = [
++ 'id',
++ 'children',
++ 'description',
++ 'parentSuite',
++ 'getFullName'
++ ];
++
++ function isMember(target, prop) {
++ return (
++ Object.keys(target).indexOf(prop) !== -1 ||
++ Object.keys(j$.Suite.prototype).indexOf(prop) !== -1
++ );
++ }
++
++ function isAllowedMember(prop) {
++ return allowedMembers.indexOf(prop) !== -1;
++ }
++
++ function msg(member) {
++ var memberName = member.toString().replace(/^Symbol\((.+)\)$/, '$1');
++ return (
++ 'Access to private Suite members (in this case `' +
++ memberName +
++ '`) is not supported and will break in ' +
++ 'a future release. See <https://jasmine.github.io/api/edge/Suite.html> ' +
++ 'for correct usage.'
++ );
++ }
++ try {
++ new Proxy({}, {});
++ } catch (e) {
++ // Environment does not support Poxy.
++ return function(suite) {
++ return suite;
++ };
++ }
++
++ function DeprecatingSuiteProxyHandler(parentSuite, env) {
++ this._parentSuite = parentSuite;
++ this._env = env;
++ }
++
++ DeprecatingSuiteProxyHandler.prototype.get = function(
++ target,
++ prop,
++ receiver
++ ) {
++ if (prop === 'children') {
++ if (!this._children) {
++ this._children = target.children.map(
++ this._proxyForChild.bind(this, receiver)
++ );
++ }
++
++ return this._children;
++ } else if (prop === 'parentSuite') {
++ return this._parentSuite;
++ } else {
++ this._maybeDeprecate(target, prop);
++ return target[prop];
++ }
++ };
++
++ DeprecatingSuiteProxyHandler.prototype.set = function(target, prop, value) {
++ this._maybeDeprecate(target, prop);
++ return (target[prop] = value);
++ };
++
++ DeprecatingSuiteProxyHandler.prototype._maybeDeprecate = function(
++ target,
++ prop
++ ) {
++ if (isMember(target, prop) && !isAllowedMember(prop)) {
++ this._env.deprecated(msg(prop));
++ }
++ };
++
++ DeprecatingSuiteProxyHandler.prototype._proxyForChild = function(
++ ownProxy,
++ child
++ ) {
++ if (child.children) {
++ return deprecatingSuiteProxy(child, ownProxy, this._env);
++ } else {
++ return j$.deprecatingSpecProxy(child, this._env);
++ }
++ };
++
++ function deprecatingSuiteProxy(suite, parentSuite, env) {
++ return new Proxy(suite, new DeprecatingSuiteProxyHandler(parentSuite, env));
++ }
++
++ return deprecatingSuiteProxy;
++};
++
++/* eslint-disable compat/compat */
++// TODO: Remove this in the next major release.
++getJasmineRequireObj().deprecatingThisProxy = function(j$) {
++ var msg =
++ "Access to 'this' in describe functions (and in arrow functions " +
++ 'inside describe functions) is deprecated.';
++
++ try {
++ new Proxy({}, {});
++ } catch (e) {
++ // Environment does not support Poxy.
++ return function(suite) {
++ return suite;
++ };
++ }
++
++ function DeprecatingThisProxyHandler(env) {
++ this._env = env;
++ }
++
++ DeprecatingThisProxyHandler.prototype.get = function(target, prop, receiver) {
++ this._env.deprecated(msg);
++ return target[prop];
++ };
++
++ DeprecatingThisProxyHandler.prototype.set = function(target, prop, value) {
++ this._env.deprecated(msg);
++ return (target[prop] = value);
++ };
++
++ return function(suite, env) {
++ return new Proxy(suite, new DeprecatingThisProxyHandler(env));
++ };
++};
++
++getJasmineRequireObj().Deprecator = function(j$) {
++ function Deprecator(topSuite) {
++ this.topSuite_ = topSuite;
++ this.verbose_ = false;
++ this.toSuppress_ = [];
++ }
++
++ var verboseNote =
++ 'Note: This message will be shown only once. Set the verboseDeprecations ' +
++ 'config property to true to see every occurrence.';
++
++ Deprecator.prototype.verboseDeprecations = function(enabled) {
++ this.verbose_ = enabled;
++ };
++
++ // runnable is a spec or a suite.
++ // deprecation is a string or an Error.
++ // See Env#deprecated for a description of the options argument.
++ Deprecator.prototype.addDeprecationWarning = function(
++ runnable,
++ deprecation,
++ options
++ ) {
++ options = options || {};
++
++ if (!this.verbose_ && !j$.isError_(deprecation)) {
++ if (this.toSuppress_.indexOf(deprecation) !== -1) {
++ return;
++ }
++ this.toSuppress_.push(deprecation);
++ }
++
++ this.log_(runnable, deprecation, options);
++ this.report_(runnable, deprecation, options);
++ };
++
++ Deprecator.prototype.log_ = function(runnable, deprecation, options) {
++ var context;
++
++ if (j$.isError_(deprecation)) {
++ console.error(deprecation);
++ return;
++ }
++
++ if (runnable === this.topSuite_ || options.ignoreRunnable) {
++ context = '';
++ } else if (runnable.children) {
++ context = ' (in suite: ' + runnable.getFullName() + ')';
++ } else {
++ context = ' (in spec: ' + runnable.getFullName() + ')';
++ }
++
++ if (!options.omitStackTrace) {
++ context += '\n' + this.stackTrace_();
++ }
++
++ if (!this.verbose_) {
++ context += '\n' + verboseNote;
++ }
++
++ console.error('DEPRECATION: ' + deprecation + context);
++ };
++
++ Deprecator.prototype.stackTrace_ = function() {
++ var formatter = new j$.ExceptionFormatter();
++ return formatter.stack(j$.util.errorWithStack()).replace(/^Error\n/m, '');
++ };
++
++ Deprecator.prototype.report_ = function(runnable, deprecation, options) {
++ if (options.ignoreRunnable) {
++ runnable = this.topSuite_;
++ }
++
++ if (j$.isError_(deprecation)) {
++ runnable.addDeprecationWarning(deprecation);
++ return;
++ }
++
++ if (!this.verbose_) {
++ deprecation += '\n' + verboseNote;
++ }
++
++ runnable.addDeprecationWarning({
++ message: deprecation,
++ omitStackTrace: options.omitStackTrace || false
++ });
++ };
++
++ return Deprecator;
++};
++
+getJasmineRequireObj().errors = function() {
+ function ExpectationFailed() {}
+
+ ExpectationFailed.prototype = new Error();
+ ExpectationFailed.prototype.constructor = ExpectationFailed;
+
+ return {
+ ExpectationFailed: ExpectationFailed
+ };
+};
+
+getJasmineRequireObj().ExceptionFormatter = function(j$) {
+ var ignoredProperties = [
+ 'name',
+ 'message',
+ 'stack',
+ 'fileName',
+ 'sourceURL',
+ 'line',
+ 'lineNumber',
+ 'column',
+ 'description',
+ 'jasmineMessage'
+ ];
+
+ function ExceptionFormatter(options) {
+ var jasmineFile = (options && options.jasmineFile) || j$.util.jasmineFile();
+ this.message = function(error) {
+ var message = '';
+
+ if (error.jasmineMessage) {
+ message += error.jasmineMessage;
+ } else if (error.name && error.message) {
+ message += error.name + ': ' + error.message;
+ } else if (error.message) {
+ message += error.message;
+ } else {
+ message += error.toString() + ' thrown';
+ }
+
+ if (error.fileName || error.sourceURL) {
+ message += ' in ' + (error.fileName || error.sourceURL);
+ }
+
+ if (error.line || error.lineNumber) {
+ message += ' (line ' + (error.line || error.lineNumber) + ')';
+ }
+
+ return message;
+ };
+
+ this.stack = function(error) {
+ if (!error || !error.stack) {
+ return null;
+ }
+
+ var stackTrace = new j$.StackTrace(error);
+ var lines = filterJasmine(stackTrace);
+ var result = '';
+
+ if (stackTrace.message) {
+ lines.unshift(stackTrace.message);
+ }
+
+ result += formatProperties(error);
+ result += lines.join('\n');
+
+ return result;
+ };
+
+ function filterJasmine(stackTrace) {
+ var result = [],
+ jasmineMarker =
+ stackTrace.style === 'webkit' ? '<Jasmine>' : ' at <Jasmine>';
+
+ stackTrace.frames.forEach(function(frame) {
+ if (frame.file !== jasmineFile) {
+ result.push(frame.raw);
+ } else if (result[result.length - 1] !== jasmineMarker) {
+ result.push(jasmineMarker);
+ }
+ });
+
+ return result;
+ }
+
+ function formatProperties(error) {
+ if (!(error instanceof Object)) {
+ return;
+ }
+
+ var result = {};
+ var empty = true;
+
+ for (var prop in error) {
+ if (j$.util.arrayContains(ignoredProperties, prop)) {
+ continue;
+ }
+ result[prop] = error[prop];
+ empty = false;
+ }
+
+ if (!empty) {
- return 'error properties: ' + j$.pp(result) + '\n';
++ return 'error properties: ' + j$.basicPrettyPrinter_(result) + '\n';
+ }
+
+ return '';
+ }
+ }
+
+ return ExceptionFormatter;
+};
+
+getJasmineRequireObj().Expectation = function(j$) {
+ /**
+ * Matchers that come with Jasmine out of the box.
+ * @namespace matchers
+ */
+ function Expectation(options) {
+ this.expector = new j$.Expector(options);
+
+ var customMatchers = options.customMatchers || {};
+ for (var matcherName in customMatchers) {
+ this[matcherName] = wrapSyncCompare(
+ matcherName,
+ customMatchers[matcherName]
+ );
+ }
+ }
+
+ /**
+ * Add some context for an {@link expect}
+ * @function
+ * @name matchers#withContext
+ * @since 3.3.0
+ * @param {String} message - Additional context to show when the matcher fails
+ * @return {matchers}
+ */
+ Expectation.prototype.withContext = function withContext(message) {
+ return addFilter(this, new ContextAddingFilter(message));
+ };
+
+ /**
+ * Invert the matcher following this {@link expect}
+ * @member
+ * @name matchers#not
+ * @since 1.3.0
+ * @type {matchers}
+ * @example
+ * expect(something).not.toBe(true);
+ */
+ Object.defineProperty(Expectation.prototype, 'not', {
+ get: function() {
+ return addFilter(this, syncNegatingFilter);
+ }
+ });
+
+ /**
+ * Asynchronous matchers that operate on an actual value which is a promise,
+ * and return a promise.
+ *
+ * Most async matchers will wait indefinitely for the promise to be resolved
+ * or rejected, resulting in a spec timeout if that never happens. If you
+ * expect that the promise will already be resolved or rejected at the time
+ * the matcher is called, you can use the {@link async-matchers#already}
+ * modifier to get a faster failure with a more helpful message.
+ *
+ * Note: Specs must await the result of each async matcher, return the
+ * promise returned by the matcher, or return a promise that's derived from
+ * the one returned by the matcher. Otherwise the matcher will not be
+ * evaluated before the spec completes.
+ *
+ * @example
+ * // Good
+ * await expectAsync(aPromise).toBeResolved();
+ * @example
+ * // Good
+ * return expectAsync(aPromise).toBeResolved();
+ * @example
+ * // Good
+ * return expectAsync(aPromise).toBeResolved()
+ * .then(function() {
+ * // more spec code
+ * });
+ * @example
+ * // Bad
+ * expectAsync(aPromise).toBeResolved();
+ * @namespace async-matchers
+ */
+ function AsyncExpectation(options) {
+ var global = options.global || j$.getGlobal();
+ this.expector = new j$.Expector(options);
+
+ if (!global.Promise) {
+ throw new Error(
+ 'expectAsync is unavailable because the environment does not support promises.'
+ );
+ }
+
+ var customAsyncMatchers = options.customAsyncMatchers || {};
+ for (var matcherName in customAsyncMatchers) {
+ this[matcherName] = wrapAsyncCompare(
+ matcherName,
+ customAsyncMatchers[matcherName]
+ );
+ }
+ }
+
+ /**
+ * Add some context for an {@link expectAsync}
+ * @function
+ * @name async-matchers#withContext
+ * @since 3.3.0
+ * @param {String} message - Additional context to show when the async matcher fails
+ * @return {async-matchers}
+ */
+ AsyncExpectation.prototype.withContext = function withContext(message) {
+ return addFilter(this, new ContextAddingFilter(message));
+ };
+
+ /**
+ * Invert the matcher following this {@link expectAsync}
+ * @member
+ * @name async-matchers#not
+ * @type {async-matchers}
+ * @example
+ * await expectAsync(myPromise).not.toBeResolved();
+ * @example
+ * return expectAsync(myPromise).not.toBeResolved();
+ */
+ Object.defineProperty(AsyncExpectation.prototype, 'not', {
+ get: function() {
+ return addFilter(this, asyncNegatingFilter);
+ }
+ });
+
+ /**
+ * Fail as soon as possible if the actual is pending.
+ * Otherwise evaluate the matcher.
+ * @member
+ * @name async-matchers#already
+ * @since 3.8.0
+ * @type {async-matchers}
+ * @example
+ * await expectAsync(myPromise).already.toBeResolved();
+ * @example
+ * return expectAsync(myPromise).already.toBeResolved();
+ */
+ Object.defineProperty(AsyncExpectation.prototype, 'already', {
+ get: function() {
+ return addFilter(this, expectSettledPromiseFilter);
+ }
+ });
+
+ function wrapSyncCompare(name, matcherFactory) {
+ return function() {
+ var result = this.expector.compare(name, matcherFactory, arguments);
+ this.expector.processResult(result);
+ };
+ }
+
+ function wrapAsyncCompare(name, matcherFactory) {
+ return function() {
+ var self = this;
+
+ // Capture the call stack here, before we go async, so that it will contain
+ // frames that are relevant to the user instead of just parts of Jasmine.
+ var errorForStack = j$.util.errorWithStack();
+
+ return this.expector
+ .compare(name, matcherFactory, arguments)
+ .then(function(result) {
+ self.expector.processResult(result, errorForStack);
+ });
+ };
+ }
+
+ function addCoreMatchers(prototype, matchers, wrapper) {
+ for (var matcherName in matchers) {
+ var matcher = matchers[matcherName];
+ prototype[matcherName] = wrapper(matcherName, matcher);
+ }
+ }
+
+ function addFilter(source, filter) {
+ var result = Object.create(source);
+ result.expector = source.expector.addFilter(filter);
+ return result;
+ }
+
+ function negatedFailureMessage(result, matcherName, args, matchersUtil) {
+ if (result.message) {
+ if (j$.isFunction_(result.message)) {
+ return result.message();
+ } else {
+ return result.message;
+ }
+ }
+
+ args = args.slice();
+ args.unshift(true);
+ args.unshift(matcherName);
+ return matchersUtil.buildFailureMessage.apply(matchersUtil, args);
+ }
+
+ function negate(result) {
+ result.pass = !result.pass;
+ return result;
+ }
+
+ var syncNegatingFilter = {
+ selectComparisonFunc: function(matcher) {
+ function defaultNegativeCompare() {
+ return negate(matcher.compare.apply(null, arguments));
+ }
+
+ return matcher.negativeCompare || defaultNegativeCompare;
+ },
+ buildFailureMessage: negatedFailureMessage
+ };
+
+ var asyncNegatingFilter = {
+ selectComparisonFunc: function(matcher) {
+ function defaultNegativeCompare() {
+ return matcher.compare.apply(this, arguments).then(negate);
+ }
+
+ return matcher.negativeCompare || defaultNegativeCompare;
+ },
+ buildFailureMessage: negatedFailureMessage
+ };
+
+ var expectSettledPromiseFilter = {
+ selectComparisonFunc: function(matcher) {
+ return function(actual) {
+ var matcherArgs = arguments;
+
+ return j$.isPending_(actual).then(function(isPending) {
+ if (isPending) {
+ return {
+ pass: false,
+ message:
+ 'Expected a promise to be settled (via ' +
+ 'expectAsync(...).already) but it was pending.'
+ };
+ } else {
+ return matcher.compare.apply(null, matcherArgs);
+ }
+ });
+ };
+ }
+ };
+
+ function ContextAddingFilter(message) {
+ this.message = message;
+ }
+
+ ContextAddingFilter.prototype.modifyFailureMessage = function(msg) {
+ var nl = msg.indexOf('\n');
+
+ if (nl === -1) {
+ return this.message + ': ' + msg;
+ } else {
+ return this.message + ':\n' + indent(msg);
+ }
+ };
+
+ function indent(s) {
+ return s.replace(/^/gm, ' ');
+ }
+
+ return {
+ factory: function(options) {
+ return new Expectation(options || {});
+ },
+ addCoreMatchers: function(matchers) {
+ addCoreMatchers(Expectation.prototype, matchers, wrapSyncCompare);
+ },
+ asyncFactory: function(options) {
+ return new AsyncExpectation(options || {});
+ },
+ addAsyncCoreMatchers: function(matchers) {
+ addCoreMatchers(AsyncExpectation.prototype, matchers, wrapAsyncCompare);
+ }
+ };
+};
+
+getJasmineRequireObj().ExpectationFilterChain = function() {
+ function ExpectationFilterChain(maybeFilter, prev) {
+ this.filter_ = maybeFilter;
+ this.prev_ = prev;
+ }
+
+ ExpectationFilterChain.prototype.addFilter = function(filter) {
+ return new ExpectationFilterChain(filter, this);
+ };
+
+ ExpectationFilterChain.prototype.selectComparisonFunc = function(matcher) {
+ return this.callFirst_('selectComparisonFunc', arguments).result;
+ };
+
+ ExpectationFilterChain.prototype.buildFailureMessage = function(
+ result,
+ matcherName,
+ args,
+ matchersUtil
+ ) {
+ return this.callFirst_('buildFailureMessage', arguments).result;
+ };
+
+ ExpectationFilterChain.prototype.modifyFailureMessage = function(msg) {
+ var result = this.callFirst_('modifyFailureMessage', arguments).result;
+ return result || msg;
+ };
+
+ ExpectationFilterChain.prototype.callFirst_ = function(fname, args) {
+ var prevResult;
+
+ if (this.prev_) {
+ prevResult = this.prev_.callFirst_(fname, args);
+
+ if (prevResult.found) {
+ return prevResult;
+ }
+ }
+
+ if (this.filter_ && this.filter_[fname]) {
+ return {
+ found: true,
+ result: this.filter_[fname].apply(this.filter_, args)
+ };
+ }
+
+ return { found: false };
+ };
+
+ return ExpectationFilterChain;
+};
+
+//TODO: expectation result may make more sense as a presentation of an expectation.
+getJasmineRequireObj().buildExpectationResult = function(j$) {
+ function buildExpectationResult(options) {
+ var messageFormatter = options.messageFormatter || function() {},
+ stackFormatter = options.stackFormatter || function() {};
+
+ /**
+ * @typedef Expectation
+ * @property {String} matcherName - The name of the matcher that was executed for this expectation.
+ * @property {String} message - The failure message for the expectation.
+ * @property {String} stack - The stack trace for the failure if available.
+ * @property {Boolean} passed - Whether the expectation passed or failed.
+ * @property {Object} expected - If the expectation failed, what was the expected value.
+ * @property {Object} actual - If the expectation failed, what actual value was produced.
+ */
+ var result = {
+ matcherName: options.matcherName,
+ message: message(),
- stack: stack(),
++ stack: options.omitStackTrace ? '' : stack(),
+ passed: options.passed
+ };
+
+ if (!result.passed) {
+ result.expected = options.expected;
+ result.actual = options.actual;
+
+ if (options.error && !j$.isString_(options.error)) {
+ if ('code' in options.error) {
+ result.code = options.error.code;
+ }
+
+ if (
+ options.error.code === 'ERR_ASSERTION' &&
+ options.expected === '' &&
+ options.actual === ''
+ ) {
+ result.expected = options.error.expected;
+ result.actual = options.error.actual;
+ result.matcherName = 'assert ' + options.error.operator;
+ }
+ }
+ }
+
+ return result;
+
+ function message() {
+ if (options.passed) {
+ return 'Passed.';
+ } else if (options.message) {
+ return options.message;
+ } else if (options.error) {
+ return messageFormatter(options.error);
+ }
+ return '';
+ }
+
+ function stack() {
+ if (options.passed) {
+ return '';
+ }
+
+ var error = options.error;
+ if (!error) {
+ if (options.errorForStack) {
+ error = options.errorForStack;
+ } else if (options.stack) {
+ error = options;
+ } else {
+ try {
+ throw new Error(message());
+ } catch (e) {
+ error = e;
+ }
+ }
+ }
+ return stackFormatter(error);
+ }
+ }
+
+ return buildExpectationResult;
+};
+
+getJasmineRequireObj().Expector = function(j$) {
+ function Expector(options) {
+ this.matchersUtil = options.matchersUtil || {
+ buildFailureMessage: function() {}
+ };
+ this.customEqualityTesters = options.customEqualityTesters || [];
+ this.actual = options.actual;
+ this.addExpectationResult = options.addExpectationResult || function() {};
+ this.filters = new j$.ExpectationFilterChain();
+ }
+
+ Expector.prototype.instantiateMatcher = function(
+ matcherName,
+ matcherFactory,
+ args
+ ) {
+ this.matcherName = matcherName;
+ this.args = Array.prototype.slice.call(args, 0);
+ this.expected = this.args.slice(0);
+
+ this.args.unshift(this.actual);
+
- var matcher = matcherFactory(this.matchersUtil, this.customEqualityTesters);
++ // TODO: Remove support for passing customEqualityTesters in the next major release.
++ var matcher;
++
++ if (matcherFactory.length >= 2) {
++ matcher = matcherFactory(this.matchersUtil, this.customEqualityTesters);
++ } else {
++ matcher = matcherFactory(this.matchersUtil);
++ }
++
+ var comparisonFunc = this.filters.selectComparisonFunc(matcher);
+ return comparisonFunc || matcher.compare;
+ };
+
+ Expector.prototype.buildMessage = function(result) {
+ var self = this;
+
+ if (result.pass) {
+ return '';
+ }
+
+ var msg = this.filters.buildFailureMessage(
+ result,
+ this.matcherName,
+ this.args,
+ this.matchersUtil,
+ defaultMessage
+ );
+ return this.filters.modifyFailureMessage(msg || defaultMessage());
+
+ function defaultMessage() {
+ if (!result.message) {
+ var args = self.args.slice();
+ args.unshift(false);
+ args.unshift(self.matcherName);
+ return self.matchersUtil.buildFailureMessage.apply(
+ self.matchersUtil,
+ args
+ );
+ } else if (j$.isFunction_(result.message)) {
+ return result.message();
+ } else {
+ return result.message;
+ }
+ }
+ };
+
+ Expector.prototype.compare = function(matcherName, matcherFactory, args) {
+ var matcherCompare = this.instantiateMatcher(
+ matcherName,
+ matcherFactory,
+ args
+ );
+ return matcherCompare.apply(null, this.args);
+ };
+
+ Expector.prototype.addFilter = function(filter) {
+ var result = Object.create(this);
+ result.filters = this.filters.addFilter(filter);
+ return result;
+ };
+
+ Expector.prototype.processResult = function(result, errorForStack) {
+ var message = this.buildMessage(result);
+
+ if (this.expected.length === 1) {
+ this.expected = this.expected[0];
+ }
+
+ this.addExpectationResult(result.pass, {
+ matcherName: this.matcherName,
+ passed: result.pass,
+ message: message,
+ error: errorForStack ? undefined : result.error,
+ errorForStack: errorForStack || undefined,
+ actual: this.actual,
+ expected: this.expected // TODO: this may need to be arrayified/sliced
+ });
+ };
+
+ return Expector;
+};
+
+getJasmineRequireObj().formatErrorMsg = function() {
+ function generateErrorMsg(domain, usage) {
+ var usageDefinition = usage ? '\nUsage: ' + usage : '';
+
+ return function errorMsg(msg) {
+ return domain + ' : ' + msg + usageDefinition;
+ };
+ }
+
+ return generateErrorMsg;
+};
+
+getJasmineRequireObj().GlobalErrors = function(j$) {
+ function GlobalErrors(global) {
+ var handlers = [];
+ global = global || j$.getGlobal();
+
+ var onerror = function onerror() {
+ var handler = handlers[handlers.length - 1];
+
+ if (handler) {
+ handler.apply(null, Array.prototype.slice.call(arguments, 0));
+ } else {
+ throw arguments[0];
+ }
+ };
+
+ this.originalHandlers = {};
+ this.jasmineHandlers = {};
+ this.installOne_ = function installOne_(errorType, jasmineMessage) {
+ function taggedOnError(error) {
+ var substituteMsg;
+
+ if (j$.isError_(error)) {
+ error.jasmineMessage = jasmineMessage + ': ' + error;
+ } else {
+ if (error) {
+ substituteMsg = jasmineMessage + ': ' + error;
+ } else {
+ substituteMsg = jasmineMessage + ' with no error or message';
+ }
+
+ if (errorType === 'unhandledRejection') {
+ substituteMsg +=
+ '\n' +
+ '(Tip: to get a useful stack trace, use ' +
+ 'Promise.reject(new Error(...)) instead of Promise.reject(' +
+ (error ? '...' : '') +
+ ').)';
+ }
+
+ error = new Error(substituteMsg);
+ }
+
+ var handler = handlers[handlers.length - 1];
+
+ if (handler) {
+ handler(error);
+ } else {
+ throw error;
+ }
+ }
+
+ this.originalHandlers[errorType] = global.process.listeners(errorType);
+ this.jasmineHandlers[errorType] = taggedOnError;
+
+ global.process.removeAllListeners(errorType);
+ global.process.on(errorType, taggedOnError);
+
+ this.uninstall = function uninstall() {
+ var errorTypes = Object.keys(this.originalHandlers);
+ for (var iType = 0; iType < errorTypes.length; iType++) {
+ var errorType = errorTypes[iType];
+ global.process.removeListener(
+ errorType,
+ this.jasmineHandlers[errorType]
+ );
+ for (var i = 0; i < this.originalHandlers[errorType].length; i++) {
+ global.process.on(errorType, this.originalHandlers[errorType][i]);
+ }
+ delete this.originalHandlers[errorType];
+ delete this.jasmineHandlers[errorType];
+ }
+ };
+ };
+
+ this.install = function install() {
+ if (
+ global.process &&
+ global.process.listeners &&
+ j$.isFunction_(global.process.on)
+ ) {
+ this.installOne_('uncaughtException', 'Uncaught exception');
+ this.installOne_('unhandledRejection', 'Unhandled promise rejection');
+ } else {
+ var originalHandler = global.onerror;
+ global.onerror = onerror;
+
+ var browserRejectionHandler = function browserRejectionHandler(event) {
+ if (j$.isError_(event.reason)) {
+ event.reason.jasmineMessage =
+ 'Unhandled promise rejection: ' + event.reason;
+ global.onerror(event.reason);
+ } else {
+ global.onerror('Unhandled promise rejection: ' + event.reason);
+ }
+ };
+
+ if (global.addEventListener) {
+ global.addEventListener(
+ 'unhandledrejection',
+ browserRejectionHandler
+ );
+ }
+
+ this.uninstall = function uninstall() {
+ global.onerror = originalHandler;
+ if (global.removeEventListener) {
+ global.removeEventListener(
+ 'unhandledrejection',
+ browserRejectionHandler
+ );
+ }
+ };
+ }
+ };
+
+ this.pushListener = function pushListener(listener) {
+ handlers.push(listener);
+ };
+
+ this.popListener = function popListener(listener) {
+ if (!listener) {
+ throw new Error('popListener expects a listener');
+ }
+
+ handlers.pop();
+ };
+ }
+
+ return GlobalErrors;
+};
+
+/* eslint-disable compat/compat */
+getJasmineRequireObj().toBePending = function(j$) {
+ /**
+ * Expect a promise to be pending, i.e. the promise is neither resolved nor rejected.
+ * @function
+ * @async
+ * @name async-matchers#toBePending
+ * @since 3.6
+ * @example
+ * await expectAsync(aPromise).toBePending();
+ */
+ return function toBePending() {
+ return {
+ compare: function(actual) {
+ if (!j$.isPromiseLike(actual)) {
+ throw new Error('Expected toBePending to be called on a promise.');
+ }
+ var want = {};
+ return Promise.race([actual, Promise.resolve(want)]).then(
+ function(got) {
+ return { pass: want === got };
+ },
+ function() {
+ return { pass: false };
+ }
+ );
+ }
+ };
+ };
+};
+
+getJasmineRequireObj().toBeRejected = function(j$) {
+ /**
+ * Expect a promise to be rejected.
+ * @function
+ * @async
+ * @name async-matchers#toBeRejected
+ * @since 3.1.0
+ * @example
+ * await expectAsync(aPromise).toBeRejected();
+ * @example
+ * return expectAsync(aPromise).toBeRejected();
+ */
+ return function toBeRejected() {
+ return {
+ compare: function(actual) {
+ if (!j$.isPromiseLike(actual)) {
+ throw new Error('Expected toBeRejected to be called on a promise.');
+ }
+ return actual.then(
+ function() {
+ return { pass: false };
+ },
+ function() {
+ return { pass: true };
+ }
+ );
+ }
+ };
+ };
+};
+
+getJasmineRequireObj().toBeRejectedWith = function(j$) {
+ /**
+ * Expect a promise to be rejected with a value equal to the expected, using deep equality comparison.
+ * @function
+ * @async
+ * @name async-matchers#toBeRejectedWith
+ * @since 3.3.0
+ * @param {Object} expected - Value that the promise is expected to be rejected with
+ * @example
+ * await expectAsync(aPromise).toBeRejectedWith({prop: 'value'});
+ * @example
+ * return expectAsync(aPromise).toBeRejectedWith({prop: 'value'});
+ */
+ return function toBeRejectedWith(matchersUtil) {
+ return {
+ compare: function(actualPromise, expectedValue) {
+ if (!j$.isPromiseLike(actualPromise)) {
+ throw new Error(
+ 'Expected toBeRejectedWith to be called on a promise.'
+ );
+ }
+
+ function prefix(passed) {
+ return (
+ 'Expected a promise ' +
+ (passed ? 'not ' : '') +
+ 'to be rejected with ' +
+ matchersUtil.pp(expectedValue)
+ );
+ }
+
+ return actualPromise.then(
+ function() {
+ return {
+ pass: false,
+ message: prefix(false) + ' but it was resolved.'
+ };
+ },
+ function(actualValue) {
+ if (matchersUtil.equals(actualValue, expectedValue)) {
+ return {
+ pass: true,
+ message: prefix(true) + '.'
+ };
+ } else {
+ return {
+ pass: false,
+ message:
+ prefix(false) +
+ ' but it was rejected with ' +
+ matchersUtil.pp(actualValue) +
+ '.'
+ };
+ }
+ }
+ );
+ }
+ };
+ };
+};
+
+getJasmineRequireObj().toBeRejectedWithError = function(j$) {
+ /**
+ * Expect a promise to be rejected with a value matched to the expected
+ * @function
+ * @async
+ * @name async-matchers#toBeRejectedWithError
+ * @since 3.5.0
+ * @param {Error} [expected] - `Error` constructor the object that was thrown needs to be an instance of. If not provided, `Error` will be used.
+ * @param {RegExp|String} [message] - The message that should be set on the thrown `Error`
+ * @example
+ * await expectAsync(aPromise).toBeRejectedWithError(MyCustomError, 'Error message');
+ * await expectAsync(aPromise).toBeRejectedWithError(MyCustomError, /Error message/);
+ * await expectAsync(aPromise).toBeRejectedWithError(MyCustomError);
+ * await expectAsync(aPromise).toBeRejectedWithError('Error message');
+ * return expectAsync(aPromise).toBeRejectedWithError(/Error message/);
+ */
+ return function toBeRejectedWithError(matchersUtil) {
+ return {
+ compare: function(actualPromise, arg1, arg2) {
+ if (!j$.isPromiseLike(actualPromise)) {
+ throw new Error(
+ 'Expected toBeRejectedWithError to be called on a promise.'
+ );
+ }
+
+ var expected = getExpectedFromArgs(arg1, arg2, matchersUtil);
+
+ return actualPromise.then(
+ function() {
+ return {
+ pass: false,
+ message: 'Expected a promise to be rejected but it was resolved.'
+ };
+ },
+ function(actualValue) {
+ return matchError(actualValue, expected, matchersUtil);
+ }
+ );
+ }
+ };
+ };
+
+ function matchError(actual, expected, matchersUtil) {
+ if (!j$.isError_(actual)) {
+ return fail(expected, 'rejected with ' + matchersUtil.pp(actual));
+ }
+
+ if (!(actual instanceof expected.error)) {
+ return fail(
+ expected,
+ 'rejected with type ' + j$.fnNameFor(actual.constructor)
+ );
+ }
+
+ var actualMessage = actual.message;
+
+ if (
+ actualMessage === expected.message ||
+ typeof expected.message === 'undefined'
+ ) {
+ return pass(expected);
+ }
+
+ if (
+ expected.message instanceof RegExp &&
+ expected.message.test(actualMessage)
+ ) {
+ return pass(expected);
+ }
+
+ return fail(expected, 'rejected with ' + matchersUtil.pp(actual));
+ }
+
+ function pass(expected) {
+ return {
+ pass: true,
+ message:
+ 'Expected a promise not to be rejected with ' +
+ expected.printValue +
+ ', but it was.'
+ };
+ }
+
+ function fail(expected, message) {
+ return {
+ pass: false,
+ message:
+ 'Expected a promise to be rejected with ' +
+ expected.printValue +
+ ' but it was ' +
+ message +
+ '.'
+ };
+ }
+
+ function getExpectedFromArgs(arg1, arg2, matchersUtil) {
+ var error, message;
+
+ if (isErrorConstructor(arg1)) {
+ error = arg1;
+ message = arg2;
+ } else {
+ error = Error;
+ message = arg1;
+ }
+
+ return {
+ error: error,
+ message: message,
+ printValue:
+ j$.fnNameFor(error) +
+ (typeof message === 'undefined' ? '' : ': ' + matchersUtil.pp(message))
+ };
+ }
+
+ function isErrorConstructor(value) {
+ return (
+ typeof value === 'function' &&
+ (value === Error || j$.isError_(value.prototype))
+ );
+ }
+};
+
+getJasmineRequireObj().toBeResolved = function(j$) {
+ /**
+ * Expect a promise to be resolved.
+ * @function
+ * @async
+ * @name async-matchers#toBeResolved
+ * @since 3.1.0
+ * @example
+ * await expectAsync(aPromise).toBeResolved();
+ * @example
+ * return expectAsync(aPromise).toBeResolved();
+ */
+ return function toBeResolved(matchersUtil) {
+ return {
+ compare: function(actual) {
+ if (!j$.isPromiseLike(actual)) {
+ throw new Error('Expected toBeResolved to be called on a promise.');
+ }
+
+ return actual.then(
+ function() {
+ return { pass: true };
+ },
+ function(e) {
+ return {
+ pass: false,
+ message:
+ 'Expected a promise to be resolved but it was ' +
+ 'rejected with ' +
+ matchersUtil.pp(e) +
+ '.'
+ };
+ }
+ );
+ }
+ };
+ };
+};
+
+getJasmineRequireObj().toBeResolvedTo = function(j$) {
+ /**
+ * Expect a promise to be resolved to a value equal to the expected, using deep equality comparison.
+ * @function
+ * @async
+ * @name async-matchers#toBeResolvedTo
+ * @since 3.1.0
+ * @param {Object} expected - Value that the promise is expected to resolve to
+ * @example
+ * await expectAsync(aPromise).toBeResolvedTo({prop: 'value'});
+ * @example
+ * return expectAsync(aPromise).toBeResolvedTo({prop: 'value'});
+ */
+ return function toBeResolvedTo(matchersUtil) {
+ return {
+ compare: function(actualPromise, expectedValue) {
+ if (!j$.isPromiseLike(actualPromise)) {
+ throw new Error('Expected toBeResolvedTo to be called on a promise.');
+ }
+
+ function prefix(passed) {
+ return (
+ 'Expected a promise ' +
+ (passed ? 'not ' : '') +
+ 'to be resolved to ' +
+ matchersUtil.pp(expectedValue)
+ );
+ }
+
+ return actualPromise.then(
+ function(actualValue) {
+ if (matchersUtil.equals(actualValue, expectedValue)) {
+ return {
+ pass: true,
+ message: prefix(true) + '.'
+ };
+ } else {
+ return {
+ pass: false,
+ message:
+ prefix(false) +
+ ' but it was resolved to ' +
+ matchersUtil.pp(actualValue) +
+ '.'
+ };
+ }
+ },
+ function(e) {
+ return {
+ pass: false,
+ message:
+ prefix(false) +
+ ' but it was rejected with ' +
+ matchersUtil.pp(e) +
+ '.'
+ };
+ }
+ );
+ }
+ };
+ };
+};
+
+getJasmineRequireObj().DiffBuilder = function(j$) {
+ return function DiffBuilder(config) {
+ var prettyPrinter = (config || {}).prettyPrinter || j$.makePrettyPrinter(),
+ mismatches = new j$.MismatchTree(),
+ path = new j$.ObjectPath(),
+ actualRoot = undefined,
+ expectedRoot = undefined;
+
+ return {
+ setRoots: function(actual, expected) {
+ actualRoot = actual;
+ expectedRoot = expected;
+ },
+
+ recordMismatch: function(formatter) {
+ mismatches.add(path, formatter);
+ },
+
+ getMessage: function() {
+ var messages = [];
+
+ mismatches.traverse(function(path, isLeaf, formatter) {
+ var actualCustom,
+ expectedCustom,
+ useCustom,
+ derefResult = dereferencePath(
+ path,
+ actualRoot,
+ expectedRoot,
+ prettyPrinter
+ ),
+ actual = derefResult.actual,
+ expected = derefResult.expected;
+
+ if (formatter) {
+ messages.push(formatter(actual, expected, path, prettyPrinter));
+ return true;
+ }
+
+ actualCustom = prettyPrinter.customFormat_(actual);
+ expectedCustom = prettyPrinter.customFormat_(expected);
+ useCustom = !(
+ j$.util.isUndefined(actualCustom) &&
+ j$.util.isUndefined(expectedCustom)
+ );
+
+ if (useCustom) {
+ messages.push(
+ wrapPrettyPrinted(actualCustom, expectedCustom, path)
+ );
+ return false; // don't recurse further
+ }
+
+ if (isLeaf) {
+ messages.push(
+ defaultFormatter(actual, expected, path, prettyPrinter)
+ );
+ }
+
+ return true;
+ });
+
+ return messages.join('\n');
+ },
+
+ withPath: function(pathComponent, block) {
+ var oldPath = path;
+ path = path.add(pathComponent);
+ block();
+ path = oldPath;
+ }
+ };
+
+ function defaultFormatter(actual, expected, path, prettyPrinter) {
+ return wrapPrettyPrinted(
+ prettyPrinter(actual),
+ prettyPrinter(expected),
+ path
+ );
+ }
+
+ function wrapPrettyPrinted(actual, expected, path) {
+ return (
+ 'Expected ' +
+ path +
+ (path.depth() ? ' = ' : '') +
+ actual +
+ ' to equal ' +
+ expected +
+ '.'
+ );
+ }
+ };
+
+ function dereferencePath(objectPath, actual, expected, pp) {
+ function handleAsymmetricExpected() {
+ if (
+ j$.isAsymmetricEqualityTester_(expected) &&
+ j$.isFunction_(expected.valuesForDiff_)
+ ) {
+ var asymmetricResult = expected.valuesForDiff_(actual, pp);
+ expected = asymmetricResult.self;
+ actual = asymmetricResult.other;
+ }
+ }
+
+ var i;
+ handleAsymmetricExpected();
+
+ for (i = 0; i < objectPath.components.length; i++) {
+ actual = actual[objectPath.components[i]];
+ expected = expected[objectPath.components[i]];
+ handleAsymmetricExpected();
+ }
+
+ return { actual: actual, expected: expected };
+ }
+};
+
+getJasmineRequireObj().MatchersUtil = function(j$) {
- // TODO: convert all uses of j$.pp to use the injected pp
-
+ /**
+ * @class MatchersUtil
+ * @classdesc Utilities for use in implementing matchers.<br>
+ * _Note:_ Do not construct this directly. Jasmine will construct one and
+ * pass it to matchers and asymmetric equality testers.
+ * @hideconstructor
+ */
+ function MatchersUtil(options) {
+ options = options || {};
+ this.customTesters_ = options.customTesters || [];
+ /**
+ * Formats a value for use in matcher failure messages and similar contexts,
+ * taking into account the current set of custom value formatters.
+ * @function
+ * @name MatchersUtil#pp
+ * @since 3.6.0
+ * @param {*} value The value to pretty-print
+ * @return {string} The pretty-printed value
+ */
+ this.pp = options.pp || function() {};
+ }
+
+ /**
+ * Determines whether `haystack` contains `needle`, using the same comparison
+ * logic as {@link MatchersUtil#equals}.
+ * @function
+ * @name MatchersUtil#contains
+ * @since 2.0.0
+ * @param {*} haystack The collection to search
+ * @param {*} needle The value to search for
- * @param [customTesters] An array of custom equality testers
++ * @param [customTesters] An array of custom equality testers. Deprecated.
++ * As of 3.6 this parameter no longer needs to be passed. It will be removed in 4.0.
+ * @returns {boolean} True if `needle` was found in `haystack`
+ */
+ MatchersUtil.prototype.contains = function(haystack, needle, customTesters) {
++ if (customTesters) {
++ j$.getEnv().deprecated(
++ 'Passing custom equality testers ' +
++ 'to MatchersUtil#contains is deprecated. ' +
++ 'See <https://jasmine.github.io/tutorials/upgrading_to_Jasmine_4.0#matchers-cet> for details.'
++ );
++ }
++
+ if (j$.isSet(haystack)) {
+ return haystack.has(needle);
+ }
+
+ if (
+ Object.prototype.toString.apply(haystack) === '[object Array]' ||
+ (!!haystack && !haystack.indexOf)
+ ) {
+ for (var i = 0; i < haystack.length; i++) {
- if (this.equals(haystack[i], needle, customTesters)) {
- return true;
++ try {
++ this.suppressDeprecation_ = true;
++ if (this.equals(haystack[i], needle, customTesters)) {
++ return true;
++ }
++ } finally {
++ this.suppressDeprecation_ = false;
+ }
+ }
+ return false;
+ }
+
+ return !!haystack && haystack.indexOf(needle) >= 0;
+ };
+
+ MatchersUtil.prototype.buildFailureMessage = function() {
+ var self = this;
+ var args = Array.prototype.slice.call(arguments, 0),
+ matcherName = args[0],
+ isNot = args[1],
+ actual = args[2],
+ expected = args.slice(3),
+ englishyPredicate = matcherName.replace(/[A-Z]/g, function(s) {
+ return ' ' + s.toLowerCase();
+ });
+
+ var message =
+ 'Expected ' +
+ self.pp(actual) +
+ (isNot ? ' not ' : ' ') +
+ englishyPredicate;
+
+ if (expected.length > 0) {
+ for (var i = 0; i < expected.length; i++) {
+ if (i > 0) {
+ message += ',';
+ }
+ message += ' ' + self.pp(expected[i]);
+ }
+ }
+
+ return message + '.';
+ };
+
+ MatchersUtil.prototype.asymmetricDiff_ = function(
+ a,
+ b,
+ aStack,
+ bStack,
+ customTesters,
+ diffBuilder
+ ) {
+ if (j$.isFunction_(b.valuesForDiff_)) {
+ var values = b.valuesForDiff_(a, this.pp);
+ this.eq_(
+ values.other,
+ values.self,
+ aStack,
+ bStack,
+ customTesters,
+ diffBuilder
+ );
+ } else {
+ diffBuilder.recordMismatch();
+ }
+ };
+
+ MatchersUtil.prototype.asymmetricMatch_ = function(
+ a,
+ b,
+ aStack,
+ bStack,
+ customTesters,
+ diffBuilder
+ ) {
+ var asymmetricA = j$.isAsymmetricEqualityTester_(a),
+ asymmetricB = j$.isAsymmetricEqualityTester_(b),
+ shim,
+ result;
+
+ if (asymmetricA === asymmetricB) {
+ return undefined;
+ }
+
+ shim = j$.asymmetricEqualityTesterArgCompatShim(this, customTesters);
+
+ if (asymmetricA) {
+ result = a.asymmetricMatch(b, shim);
+ if (!result) {
+ diffBuilder.recordMismatch();
+ }
+ return result;
+ }
+
+ if (asymmetricB) {
+ result = b.asymmetricMatch(a, shim);
+ if (!result) {
+ this.asymmetricDiff_(a, b, aStack, bStack, customTesters, diffBuilder);
+ }
+ return result;
+ }
+ };
+
+ /**
+ * Determines whether two values are deeply equal to each other.
+ * @function
+ * @name MatchersUtil#equals
+ * @since 2.0.0
+ * @param {*} a The first value to compare
+ * @param {*} b The second value to compare
- * @param [customTesters] An array of custom equality testers
++ * @param [customTesters] An array of custom equality testers. Deprecated.
++ * As of 3.6 this parameter no longer needs to be passed. It will be removed in 4.0.
+ * @returns {boolean} True if the values are equal
+ */
+ MatchersUtil.prototype.equals = function(
+ a,
+ b,
+ customTestersOrDiffBuilder,
+ diffBuilderOrNothing
+ ) {
+ var customTesters, diffBuilder;
+
+ if (isDiffBuilder(customTestersOrDiffBuilder)) {
+ diffBuilder = customTestersOrDiffBuilder;
+ } else {
++ if (customTestersOrDiffBuilder && !this.suppressDeprecation_) {
++ j$.getEnv().deprecated(
++ 'Passing custom equality testers ' +
++ 'to MatchersUtil#equals is deprecated. ' +
++ 'See <https://jasmine.github.io/tutorials/upgrading_to_Jasmine_4.0#matchers-cet> for details.'
++ );
++ }
++
++ if (diffBuilderOrNothing) {
++ j$.getEnv().deprecated(
++ 'Diff builder should be passed ' +
++ 'as the third argument to MatchersUtil#equals, not the fourth. ' +
++ 'See <https://jasmine.github.io/tutorials/upgrading_to_Jasmine_4.0#matchers-cet> for details.'
++ );
++ }
++
+ customTesters = customTestersOrDiffBuilder;
+ diffBuilder = diffBuilderOrNothing;
+ }
+
+ customTesters = customTesters || this.customTesters_;
+ diffBuilder = diffBuilder || j$.NullDiffBuilder();
+ diffBuilder.setRoots(a, b);
+
+ return this.eq_(a, b, [], [], customTesters, diffBuilder);
+ };
+
+ // Equality function lovingly adapted from isEqual in
+ // [Underscore](http://underscorejs.org)
+ MatchersUtil.prototype.eq_ = function(
+ a,
+ b,
+ aStack,
+ bStack,
+ customTesters,
+ diffBuilder
+ ) {
+ var result = true,
+ self = this,
+ i;
+
+ var asymmetricResult = this.asymmetricMatch_(
+ a,
+ b,
+ aStack,
+ bStack,
+ customTesters,
+ diffBuilder
+ );
+ if (!j$.util.isUndefined(asymmetricResult)) {
+ return asymmetricResult;
+ }
+
+ for (i = 0; i < customTesters.length; i++) {
+ var customTesterResult = customTesters[i](a, b);
+ if (!j$.util.isUndefined(customTesterResult)) {
+ if (!customTesterResult) {
+ diffBuilder.recordMismatch();
+ }
+ return customTesterResult;
+ }
+ }
+
+ if (a instanceof Error && b instanceof Error) {
+ result = a.message == b.message;
+ if (!result) {
+ diffBuilder.recordMismatch();
+ }
+ return result;
+ }
+
+ // Identical objects are equal. `0 === -0`, but they aren't identical.
+ // See the [Harmony `egal` proposal](http://wiki.ecmascript.org/doku.php?id=harmony:egal).
+ if (a === b) {
+ result = a !== 0 || 1 / a == 1 / b;
+ if (!result) {
+ diffBuilder.recordMismatch();
+ }
+ return result;
+ }
+ // A strict comparison is necessary because `null == undefined`.
+ if (a === null || b === null) {
+ result = a === b;
+ if (!result) {
+ diffBuilder.recordMismatch();
+ }
+ return result;
+ }
+ var className = Object.prototype.toString.call(a);
+ if (className != Object.prototype.toString.call(b)) {
+ diffBuilder.recordMismatch();
+ return false;
+ }
+ switch (className) {
+ // Strings, numbers, dates, and booleans are compared by value.
+ case '[object String]':
+ // Primitives and their corresponding object wrappers are equivalent; thus, `"5"` is
+ // equivalent to `new String("5")`.
+ result = a == String(b);
+ if (!result) {
+ diffBuilder.recordMismatch();
+ }
+ return result;
+ case '[object Number]':
+ // `NaN`s are equivalent, but non-reflexive. An `egal` comparison is performed for
+ // other numeric values.
+ result =
+ a != +a ? b != +b : a === 0 && b === 0 ? 1 / a == 1 / b : a == +b;
+ if (!result) {
+ diffBuilder.recordMismatch();
+ }
+ return result;
+ case '[object Date]':
+ case '[object Boolean]':
+ // Coerce dates and booleans to numeric primitive values. Dates are compared by their
+ // millisecond representations. Note that invalid dates with millisecond representations
+ // of `NaN` are not equivalent.
+ result = +a == +b;
+ if (!result) {
+ diffBuilder.recordMismatch();
+ }
+ return result;
+ case '[object ArrayBuffer]':
+ // If we have an instance of ArrayBuffer the Uint8Array ctor
+ // will be defined as well
+ return self.eq_(
+ new Uint8Array(a), // eslint-disable-line compat/compat
+ new Uint8Array(b), // eslint-disable-line compat/compat
+ aStack,
+ bStack,
+ customTesters,
+ diffBuilder
+ );
+ // RegExps are compared by their source patterns and flags.
+ case '[object RegExp]':
+ return (
+ a.source == b.source &&
+ a.global == b.global &&
+ a.multiline == b.multiline &&
+ a.ignoreCase == b.ignoreCase
+ );
+ }
+ if (typeof a != 'object' || typeof b != 'object') {
+ diffBuilder.recordMismatch();
+ return false;
+ }
+
+ var aIsDomNode = j$.isDomNode(a);
+ var bIsDomNode = j$.isDomNode(b);
+ if (aIsDomNode && bIsDomNode) {
+ // At first try to use DOM3 method isEqualNode
+ result = a.isEqualNode(b);
+ if (!result) {
+ diffBuilder.recordMismatch();
+ }
+ return result;
+ }
+ if (aIsDomNode || bIsDomNode) {
+ diffBuilder.recordMismatch();
+ return false;
+ }
+
+ var aIsPromise = j$.isPromise(a);
+ var bIsPromise = j$.isPromise(b);
+ if (aIsPromise && bIsPromise) {
+ return a === b;
+ }
+
+ // Assume equality for cyclic structures. The algorithm for detecting cyclic
+ // structures is adapted from ES 5.1 section 15.12.3, abstract operation `JO`.
+ var length = aStack.length;
+ while (length--) {
+ // Linear search. Performance is inversely proportional to the number of
+ // unique nested structures.
+ if (aStack[length] == a) {
+ return bStack[length] == b;
+ }
+ }
+ // Add the first object to the stack of traversed objects.
+ aStack.push(a);
+ bStack.push(b);
+ var size = 0;
+ // Recursively compare objects and arrays.
+ // Compare array lengths to determine if a deep comparison is necessary.
+ if (className == '[object Array]') {
+ var aLength = a.length;
+ var bLength = b.length;
+
+ diffBuilder.withPath('length', function() {
+ if (aLength !== bLength) {
+ diffBuilder.recordMismatch();
+ result = false;
+ }
+ });
+
+ for (i = 0; i < aLength || i < bLength; i++) {
+ diffBuilder.withPath(i, function() {
+ if (i >= bLength) {
+ diffBuilder.recordMismatch(
+ actualArrayIsLongerFormatter.bind(null, self.pp)
+ );
+ result = false;
+ } else {
+ result =
+ self.eq_(
+ i < aLength ? a[i] : void 0,
+ i < bLength ? b[i] : void 0,
+ aStack,
+ bStack,
+ customTesters,
+ diffBuilder
+ ) && result;
+ }
+ });
+ }
+ if (!result) {
+ return false;
+ }
+ } else if (j$.isMap(a) && j$.isMap(b)) {
+ if (a.size != b.size) {
+ diffBuilder.recordMismatch();
+ return false;
+ }
+
+ var keysA = [];
+ var keysB = [];
+ a.forEach(function(valueA, keyA) {
+ keysA.push(keyA);
+ });
+ b.forEach(function(valueB, keyB) {
+ keysB.push(keyB);
+ });
+
+ // For both sets of keys, check they map to equal values in both maps.
+ // Keep track of corresponding keys (in insertion order) in order to handle asymmetric obj keys.
+ var mapKeys = [keysA, keysB];
+ var cmpKeys = [keysB, keysA];
+ var mapIter, mapKey, mapValueA, mapValueB;
+ var cmpIter, cmpKey;
+ for (i = 0; result && i < mapKeys.length; i++) {
+ mapIter = mapKeys[i];
+ cmpIter = cmpKeys[i];
+
+ for (var j = 0; result && j < mapIter.length; j++) {
+ mapKey = mapIter[j];
+ cmpKey = cmpIter[j];
+ mapValueA = a.get(mapKey);
+
+ // Only use the cmpKey when one of the keys is asymmetric and the corresponding key matches,
+ // otherwise explicitly look up the mapKey in the other Map since we want keys with unique
+ // obj identity (that are otherwise equal) to not match.
+ if (
+ j$.isAsymmetricEqualityTester_(mapKey) ||
+ (j$.isAsymmetricEqualityTester_(cmpKey) &&
+ this.eq_(
+ mapKey,
+ cmpKey,
+ aStack,
+ bStack,
+ customTesters,
+ j$.NullDiffBuilder()
+ ))
+ ) {
+ mapValueB = b.get(cmpKey);
+ } else {
+ mapValueB = b.get(mapKey);
+ }
+ result = this.eq_(
+ mapValueA,
+ mapValueB,
+ aStack,
+ bStack,
+ customTesters,
+ j$.NullDiffBuilder()
+ );
+ }
+ }
+
+ if (!result) {
+ diffBuilder.recordMismatch();
+ return false;
+ }
+ } else if (j$.isSet(a) && j$.isSet(b)) {
+ if (a.size != b.size) {
+ diffBuilder.recordMismatch();
+ return false;
+ }
+
+ var valuesA = [];
+ a.forEach(function(valueA) {
+ valuesA.push(valueA);
+ });
+ var valuesB = [];
+ b.forEach(function(valueB) {
+ valuesB.push(valueB);
+ });
+
+ // For both sets, check they are all contained in the other set
+ var setPairs = [[valuesA, valuesB], [valuesB, valuesA]];
+ var stackPairs = [[aStack, bStack], [bStack, aStack]];
+ var baseValues, baseValue, baseStack;
+ var otherValues, otherValue, otherStack;
+ var found;
+ var prevStackSize;
+ for (i = 0; result && i < setPairs.length; i++) {
+ baseValues = setPairs[i][0];
+ otherValues = setPairs[i][1];
+ baseStack = stackPairs[i][0];
+ otherStack = stackPairs[i][1];
+ // For each value in the base set...
+ for (var k = 0; result && k < baseValues.length; k++) {
+ baseValue = baseValues[k];
+ found = false;
+ // ... test that it is present in the other set
+ for (var l = 0; !found && l < otherValues.length; l++) {
+ otherValue = otherValues[l];
+ prevStackSize = baseStack.length;
+ // compare by value equality
+ found = this.eq_(
+ baseValue,
+ otherValue,
+ baseStack,
+ otherStack,
+ customTesters,
+ j$.NullDiffBuilder()
+ );
+ if (!found && prevStackSize !== baseStack.length) {
+ baseStack.splice(prevStackSize);
+ otherStack.splice(prevStackSize);
+ }
+ }
+ result = result && found;
+ }
+ }
+
+ if (!result) {
+ diffBuilder.recordMismatch();
+ return false;
+ }
+ } else if (j$.isURL(a) && j$.isURL(b)) {
+ // URLs have no enumrable properties, so the default object comparison
+ // would consider any two URLs to be equal.
+ return a.toString() === b.toString();
+ } else {
+ // Objects with different constructors are not equivalent, but `Object`s
+ // or `Array`s from different frames are.
+ var aCtor = a.constructor,
+ bCtor = b.constructor;
+ if (
+ aCtor !== bCtor &&
+ isFunction(aCtor) &&
+ isFunction(bCtor) &&
+ a instanceof aCtor &&
+ b instanceof bCtor &&
+ !(aCtor instanceof aCtor && bCtor instanceof bCtor)
+ ) {
+ diffBuilder.recordMismatch(
+ constructorsAreDifferentFormatter.bind(null, this.pp)
+ );
+ return false;
+ }
+ }
+
+ // Deep compare objects.
+ var aKeys = keys(a, className == '[object Array]'),
+ key;
+ size = aKeys.length;
+
+ // Ensure that both objects contain the same number of properties before comparing deep equality.
+ if (keys(b, className == '[object Array]').length !== size) {
+ diffBuilder.recordMismatch(
+ objectKeysAreDifferentFormatter.bind(null, this.pp)
+ );
+ return false;
+ }
+
+ for (i = 0; i < size; i++) {
+ key = aKeys[i];
+ // Deep compare each member
+ if (!j$.util.has(b, key)) {
+ diffBuilder.recordMismatch(
+ objectKeysAreDifferentFormatter.bind(null, this.pp)
+ );
+ result = false;
+ continue;
+ }
+
+ diffBuilder.withPath(key, function() {
+ if (
+ !self.eq_(a[key], b[key], aStack, bStack, customTesters, diffBuilder)
+ ) {
+ result = false;
+ }
+ });
+ }
+
+ if (!result) {
+ return false;
+ }
+
+ // Remove the first object from the stack of traversed objects.
+ aStack.pop();
+ bStack.pop();
+
+ return result;
+ };
+
+ function keys(obj, isArray) {
+ var allKeys = Object.keys
+ ? Object.keys(obj)
+ : (function(o) {
+ var keys = [];
+ for (var key in o) {
+ if (j$.util.has(o, key)) {
+ keys.push(key);
+ }
+ }
+ return keys;
+ })(obj);
+
+ if (!isArray) {
+ return allKeys;
+ }
+
+ if (allKeys.length === 0) {
+ return allKeys;
+ }
+
+ var extraKeys = [];
+ for (var i = 0; i < allKeys.length; i++) {
+ if (!/^[0-9]+$/.test(allKeys[i])) {
+ extraKeys.push(allKeys[i]);
+ }
+ }
+
+ return extraKeys;
+ }
+
+ function isFunction(obj) {
+ return typeof obj === 'function';
+ }
+
+ function objectKeysAreDifferentFormatter(pp, actual, expected, path) {
+ var missingProperties = j$.util.objectDifference(expected, actual),
+ extraProperties = j$.util.objectDifference(actual, expected),
+ missingPropertiesMessage = formatKeyValuePairs(pp, missingProperties),
+ extraPropertiesMessage = formatKeyValuePairs(pp, extraProperties),
+ messages = [];
+
+ if (!path.depth()) {
+ path = 'object';
+ }
+
+ if (missingPropertiesMessage.length) {
+ messages.push(
+ 'Expected ' + path + ' to have properties' + missingPropertiesMessage
+ );
+ }
+
+ if (extraPropertiesMessage.length) {
+ messages.push(
+ 'Expected ' + path + ' not to have properties' + extraPropertiesMessage
+ );
+ }
+
+ return messages.join('\n');
+ }
+
+ function constructorsAreDifferentFormatter(pp, actual, expected, path) {
+ if (!path.depth()) {
+ path = 'object';
+ }
+
+ return (
+ 'Expected ' +
+ path +
+ ' to be a kind of ' +
+ j$.fnNameFor(expected.constructor) +
+ ', but was ' +
+ pp(actual) +
+ '.'
+ );
+ }
+
+ function actualArrayIsLongerFormatter(pp, actual, expected, path) {
+ return (
+ 'Unexpected ' +
+ path +
+ (path.depth() ? ' = ' : '') +
+ pp(actual) +
+ ' in array.'
+ );
+ }
+
+ function formatKeyValuePairs(pp, obj) {
+ var formatted = '';
+ for (var key in obj) {
+ formatted += '\n ' + key + ': ' + pp(obj[key]);
+ }
+ return formatted;
+ }
+
+ function isDiffBuilder(obj) {
+ return obj && typeof obj.recordMismatch === 'function';
+ }
+
+ return MatchersUtil;
+};
+
+/**
+ * @interface AsymmetricEqualityTester
+ * @classdesc An asymmetric equality tester is an object that can match multiple
+ * objects. Examples include jasmine.any() and jasmine.stringMatching(). Jasmine
+ * includes a number of built-in asymmetric equality testers, such as
+ * {@link jasmine.objectContaining}. User-defined asymmetric equality testers are
+ * also supported.
+ *
+ * Asymmetric equality testers work with any matcher, including user-defined
+ * custom matchers, that uses {@link MatchersUtil#equals} or
+ * {@link MatchersUtil#contains}.
+ *
+ * @example
+ * function numberDivisibleBy(divisor) {
+ * return {
+ * asymmetricMatch: function(n) {
+ * return typeof n === 'number' && n % divisor === 0;
+ * },
+ * jasmineToString: function() {
+ * return `<a number divisible by ${divisor}>`;
+ * }
+ * };
+ * }
+ *
+ * var actual = {
+ * n: 2,
+ * otherFields: "don't care"
+ * };
+ *
+ * expect(actual).toEqual(jasmine.objectContaining({n: numberDivisibleBy(2)}));
+ * @see custom_asymmetric_equality_testers
+ * @since 2.0.0
+ */
+/**
+ * Determines whether a value matches this tester
+ * @function
+ * @name AsymmetricEqualityTester#asymmetricMatch
+ * @param value {any} The value to test
+ * @param matchersUtil {MatchersUtil} utilities for testing equality, etc
+ * @return {Boolean}
+ */
+/**
+ * Returns a string representation of this tester to use in matcher failure messages
+ * @function
+ * @name AsymmetricEqualityTester#jasmineToString
+ * @param pp {function} Function that takes a value and returns a pretty-printed representation
+ * @return {String}
+ */
+
+getJasmineRequireObj().MismatchTree = function(j$) {
+ /*
+ To be able to apply custom object formatters at all possible levels of an
+ object graph, DiffBuilder needs to be able to know not just where the
+ mismatch occurred but also all ancestors of the mismatched value in both
+ the expected and actual object graphs. MismatchTree maintains that context
+ and provides it via the traverse method.
+ */
+ function MismatchTree(path) {
+ this.path = path || new j$.ObjectPath([]);
+ this.formatter = undefined;
+ this.children = [];
+ this.isMismatch = false;
+ }
+
+ MismatchTree.prototype.add = function(path, formatter) {
+ var key, child;
+
+ if (path.depth() === 0) {
+ this.formatter = formatter;
+ this.isMismatch = true;
+ } else {
+ key = path.components[0];
+ path = path.shift();
+ child = this.child(key);
+
+ if (!child) {
+ child = new MismatchTree(this.path.add(key));
+ this.children.push(child);
+ }
+
+ child.add(path, formatter);
+ }
+ };
+
+ MismatchTree.prototype.traverse = function(visit) {
+ var i,
+ hasChildren = this.children.length > 0;
+
+ if (this.isMismatch || hasChildren) {
+ if (visit(this.path, !hasChildren, this.formatter)) {
+ for (i = 0; i < this.children.length; i++) {
+ this.children[i].traverse(visit);
+ }
+ }
+ }
+ };
+
+ MismatchTree.prototype.child = function(key) {
+ var i, pathEls;
+
+ for (i = 0; i < this.children.length; i++) {
+ pathEls = this.children[i].path.components;
+ if (pathEls[pathEls.length - 1] === key) {
+ return this.children[i];
+ }
+ }
+ };
+
+ return MismatchTree;
+};
+
+getJasmineRequireObj().nothing = function() {
+ /**
+ * {@link expect} nothing explicitly.
+ * @function
+ * @name matchers#nothing
+ * @since 2.8.0
+ * @example
+ * expect().nothing();
+ */
+ function nothing() {
+ return {
+ compare: function() {
+ return {
+ pass: true
+ };
+ }
+ };
+ }
+
+ return nothing;
+};
+
+getJasmineRequireObj().NullDiffBuilder = function(j$) {
+ return function() {
+ return {
+ withPath: function(_, block) {
+ block();
+ },
+ setRoots: function() {},
+ recordMismatch: function() {}
+ };
+ };
+};
+
+getJasmineRequireObj().ObjectPath = function(j$) {
+ function ObjectPath(components) {
+ this.components = components || [];
+ }
+
+ ObjectPath.prototype.toString = function() {
+ if (this.components.length) {
+ return '$' + map(this.components, formatPropertyAccess).join('');
+ } else {
+ return '';
+ }
+ };
+
+ ObjectPath.prototype.add = function(component) {
+ return new ObjectPath(this.components.concat([component]));
+ };
+
+ ObjectPath.prototype.shift = function() {
+ return new ObjectPath(this.components.slice(1));
+ };
+
+ ObjectPath.prototype.depth = function() {
+ return this.components.length;
+ };
+
+ function formatPropertyAccess(prop) {
+ if (typeof prop === 'number') {
+ return '[' + prop + ']';
+ }
+
+ if (isValidIdentifier(prop)) {
+ return '.' + prop;
+ }
+
+ return "['" + prop + "']";
+ }
+
+ function map(array, fn) {
+ var results = [];
+ for (var i = 0; i < array.length; i++) {
+ results.push(fn(array[i]));
+ }
+ return results;
+ }
+
+ function isValidIdentifier(string) {
+ return /^[A-Za-z\$_][A-Za-z0-9\$_]*$/.test(string);
+ }
+
+ return ObjectPath;
+};
+
+getJasmineRequireObj().requireAsyncMatchers = function(jRequire, j$) {
+ var availableMatchers = [
+ 'toBePending',
+ 'toBeResolved',
+ 'toBeRejected',
+ 'toBeResolvedTo',
+ 'toBeRejectedWith',
+ 'toBeRejectedWithError'
+ ],
+ matchers = {};
+
+ for (var i = 0; i < availableMatchers.length; i++) {
+ var name = availableMatchers[i];
+ matchers[name] = jRequire[name](j$);
+ }
+
+ return matchers;
+};
+
+getJasmineRequireObj().toBe = function(j$) {
+ /**
+ * {@link expect} the actual value to be `===` to the expected value.
+ * @function
+ * @name matchers#toBe
+ * @since 1.3.0
+ * @param {Object} expected - The expected value to compare against.
+ * @example
+ * expect(thing).toBe(realThing);
+ */
+ function toBe(matchersUtil) {
+ var tip =
+ ' Tip: To check for deep equality, use .toEqual() instead of .toBe().';
+
+ return {
+ compare: function(actual, expected) {
+ var result = {
+ pass: actual === expected
+ };
+
+ if (typeof expected === 'object') {
+ result.message =
+ matchersUtil.buildFailureMessage(
+ 'toBe',
+ result.pass,
+ actual,
+ expected
+ ) + tip;
+ }
+
+ return result;
+ }
+ };
+ }
+
+ return toBe;
+};
+
+getJasmineRequireObj().toBeCloseTo = function() {
+ /**
+ * {@link expect} the actual value to be within a specified precision of the expected value.
+ * @function
+ * @name matchers#toBeCloseTo
+ * @since 1.3.0
+ * @param {Object} expected - The expected value to compare against.
+ * @param {Number} [precision=2] - The number of decimal points to check.
+ * @example
+ * expect(number).toBeCloseTo(42.2, 3);
+ */
+ function toBeCloseTo() {
+ return {
+ compare: function(actual, expected, precision) {
+ if (precision !== 0) {
+ precision = precision || 2;
+ }
+
+ if (expected === null || actual === null) {
+ throw new Error(
+ 'Cannot use toBeCloseTo with null. Arguments evaluated to: ' +
+ 'expect(' +
+ actual +
+ ').toBeCloseTo(' +
+ expected +
+ ').'
+ );
+ }
+
+ var pow = Math.pow(10, precision + 1);
+ var delta = Math.abs(expected - actual);
+ var maxDelta = Math.pow(10, -precision) / 2;
+
+ return {
+ pass: Math.round(delta * pow) <= maxDelta * pow
+ };
+ }
+ };
+ }
+
+ return toBeCloseTo;
+};
+
+getJasmineRequireObj().toBeDefined = function() {
+ /**
+ * {@link expect} the actual value to be defined. (Not `undefined`)
+ * @function
+ * @name matchers#toBeDefined
+ * @since 1.3.0
+ * @example
+ * expect(result).toBeDefined();
+ */
+ function toBeDefined() {
+ return {
+ compare: function(actual) {
+ return {
+ pass: void 0 !== actual
+ };
+ }
+ };
+ }
+
+ return toBeDefined;
+};
+
+getJasmineRequireObj().toBeFalse = function() {
+ /**
+ * {@link expect} the actual value to be `false`.
+ * @function
+ * @name matchers#toBeFalse
+ * @since 3.5.0
+ * @example
+ * expect(result).toBeFalse();
+ */
+ function toBeFalse() {
+ return {
+ compare: function(actual) {
+ return {
+ pass: actual === false
+ };
+ }
+ };
+ }
+
+ return toBeFalse;
+};
+
+getJasmineRequireObj().toBeFalsy = function() {
+ /**
+ * {@link expect} the actual value to be falsy
+ * @function
+ * @name matchers#toBeFalsy
+ * @since 2.0.0
+ * @example
+ * expect(result).toBeFalsy();
+ */
+ function toBeFalsy() {
+ return {
+ compare: function(actual) {
+ return {
+ pass: !actual
+ };
+ }
+ };
+ }
+
+ return toBeFalsy;
+};
+
+getJasmineRequireObj().toBeGreaterThan = function() {
+ /**
+ * {@link expect} the actual value to be greater than the expected value.
+ * @function
+ * @name matchers#toBeGreaterThan
+ * @since 2.0.0
+ * @param {Number} expected - The value to compare against.
+ * @example
+ * expect(result).toBeGreaterThan(3);
+ */
+ function toBeGreaterThan() {
+ return {
+ compare: function(actual, expected) {
+ return {
+ pass: actual > expected
+ };
+ }
+ };
+ }
+
+ return toBeGreaterThan;
+};
+
+getJasmineRequireObj().toBeGreaterThanOrEqual = function() {
+ /**
+ * {@link expect} the actual value to be greater than or equal to the expected value.
+ * @function
+ * @name matchers#toBeGreaterThanOrEqual
+ * @since 2.0.0
+ * @param {Number} expected - The expected value to compare against.
+ * @example
+ * expect(result).toBeGreaterThanOrEqual(25);
+ */
+ function toBeGreaterThanOrEqual() {
+ return {
+ compare: function(actual, expected) {
+ return {
+ pass: actual >= expected
+ };
+ }
+ };
+ }
+
+ return toBeGreaterThanOrEqual;
+};
+
+getJasmineRequireObj().toBeInstanceOf = function(j$) {
+ var usageError = j$.formatErrorMsg(
+ '<toBeInstanceOf>',
+ 'expect(value).toBeInstanceOf(<ConstructorFunction>)'
+ );
+
+ /**
+ * {@link expect} the actual to be an instance of the expected class
+ * @function
+ * @name matchers#toBeInstanceOf
+ * @since 3.5.0
+ * @param {Object} expected - The class or constructor function to check for
+ * @example
+ * expect('foo').toBeInstanceOf(String);
+ * expect(3).toBeInstanceOf(Number);
+ * expect(new Error()).toBeInstanceOf(Error);
+ */
+ function toBeInstanceOf(matchersUtil) {
+ return {
+ compare: function(actual, expected) {
+ var actualType =
+ actual && actual.constructor
+ ? j$.fnNameFor(actual.constructor)
+ : matchersUtil.pp(actual),
+ expectedType = expected
+ ? j$.fnNameFor(expected)
+ : matchersUtil.pp(expected),
+ expectedMatcher,
+ pass;
+
+ try {
+ expectedMatcher = new j$.Any(expected);
+ pass = expectedMatcher.asymmetricMatch(actual);
+ } catch (error) {
+ throw new Error(
+ usageError('Expected value is not a constructor function')
+ );
+ }
+
+ if (pass) {
+ return {
+ pass: true,
+ message:
+ 'Expected instance of ' +
+ actualType +
+ ' not to be an instance of ' +
+ expectedType
+ };
+ } else {
+ return {
+ pass: false,
+ message:
+ 'Expected instance of ' +
+ actualType +
+ ' to be an instance of ' +
+ expectedType
+ };
+ }
+ }
+ };
+ }
+
+ return toBeInstanceOf;
+};
+
+getJasmineRequireObj().toBeLessThan = function() {
+ /**
+ * {@link expect} the actual value to be less than the expected value.
+ * @function
+ * @name matchers#toBeLessThan
+ * @since 2.0.0
+ * @param {Number} expected - The expected value to compare against.
+ * @example
+ * expect(result).toBeLessThan(0);
+ */
+ function toBeLessThan() {
+ return {
+ compare: function(actual, expected) {
+ return {
+ pass: actual < expected
+ };
+ }
+ };
+ }
+
+ return toBeLessThan;
+};
+
+getJasmineRequireObj().toBeLessThanOrEqual = function() {
+ /**
+ * {@link expect} the actual value to be less than or equal to the expected value.
+ * @function
+ * @name matchers#toBeLessThanOrEqual
+ * @since 2.0.0
+ * @param {Number} expected - The expected value to compare against.
+ * @example
+ * expect(result).toBeLessThanOrEqual(123);
+ */
+ function toBeLessThanOrEqual() {
+ return {
+ compare: function(actual, expected) {
+ return {
+ pass: actual <= expected
+ };
+ }
+ };
+ }
+
+ return toBeLessThanOrEqual;
+};
+
+getJasmineRequireObj().toBeNaN = function(j$) {
+ /**
+ * {@link expect} the actual value to be `NaN` (Not a Number).
+ * @function
+ * @name matchers#toBeNaN
+ * @since 1.3.0
+ * @example
+ * expect(thing).toBeNaN();
+ */
+ function toBeNaN(matchersUtil) {
+ return {
+ compare: function(actual) {
+ var result = {
+ pass: actual !== actual
+ };
+
+ if (result.pass) {
+ result.message = 'Expected actual not to be NaN.';
+ } else {
+ result.message = function() {
+ return 'Expected ' + matchersUtil.pp(actual) + ' to be NaN.';
+ };
+ }
+
+ return result;
+ }
+ };
+ }
+
+ return toBeNaN;
+};
+
+getJasmineRequireObj().toBeNegativeInfinity = function(j$) {
+ /**
+ * {@link expect} the actual value to be `-Infinity` (-infinity).
+ * @function
+ * @name matchers#toBeNegativeInfinity
+ * @since 2.6.0
+ * @example
+ * expect(thing).toBeNegativeInfinity();
+ */
+ function toBeNegativeInfinity(matchersUtil) {
+ return {
+ compare: function(actual) {
+ var result = {
+ pass: actual === Number.NEGATIVE_INFINITY
+ };
+
+ if (result.pass) {
+ result.message = 'Expected actual not to be -Infinity.';
+ } else {
+ result.message = function() {
+ return 'Expected ' + matchersUtil.pp(actual) + ' to be -Infinity.';
+ };
+ }
+
+ return result;
+ }
+ };
+ }
+
+ return toBeNegativeInfinity;
+};
+
+getJasmineRequireObj().toBeNull = function() {
+ /**
+ * {@link expect} the actual value to be `null`.
+ * @function
+ * @name matchers#toBeNull
+ * @since 1.3.0
+ * @example
+ * expect(result).toBeNull();
+ */
+ function toBeNull() {
+ return {
+ compare: function(actual) {
+ return {
+ pass: actual === null
+ };
+ }
+ };
+ }
+
+ return toBeNull;
+};
+
+getJasmineRequireObj().toBePositiveInfinity = function(j$) {
+ /**
+ * {@link expect} the actual value to be `Infinity` (infinity).
+ * @function
+ * @name matchers#toBePositiveInfinity
+ * @since 2.6.0
+ * @example
+ * expect(thing).toBePositiveInfinity();
+ */
+ function toBePositiveInfinity(matchersUtil) {
+ return {
+ compare: function(actual) {
+ var result = {
+ pass: actual === Number.POSITIVE_INFINITY
+ };
+
+ if (result.pass) {
+ result.message = 'Expected actual not to be Infinity.';
+ } else {
+ result.message = function() {
+ return 'Expected ' + matchersUtil.pp(actual) + ' to be Infinity.';
+ };
+ }
+
+ return result;
+ }
+ };
+ }
+
+ return toBePositiveInfinity;
+};
+
+getJasmineRequireObj().toBeTrue = function() {
+ /**
+ * {@link expect} the actual value to be `true`.
+ * @function
+ * @name matchers#toBeTrue
+ * @since 3.5.0
+ * @example
+ * expect(result).toBeTrue();
+ */
+ function toBeTrue() {
+ return {
+ compare: function(actual) {
+ return {
+ pass: actual === true
+ };
+ }
+ };
+ }
+
+ return toBeTrue;
+};
+
+getJasmineRequireObj().toBeTruthy = function() {
+ /**
+ * {@link expect} the actual value to be truthy.
+ * @function
+ * @name matchers#toBeTruthy
+ * @since 2.0.0
+ * @example
+ * expect(thing).toBeTruthy();
+ */
+ function toBeTruthy() {
+ return {
+ compare: function(actual) {
+ return {
+ pass: !!actual
+ };
+ }
+ };
+ }
+
+ return toBeTruthy;
+};
+
+getJasmineRequireObj().toBeUndefined = function() {
+ /**
+ * {@link expect} the actual value to be `undefined`.
+ * @function
+ * @name matchers#toBeUndefined
+ * @since 1.3.0
+ * @example
+ * expect(result).toBeUndefined():
+ */
+ function toBeUndefined() {
+ return {
+ compare: function(actual) {
+ return {
+ pass: void 0 === actual
+ };
+ }
+ };
+ }
+
+ return toBeUndefined;
+};
+
+getJasmineRequireObj().toContain = function() {
+ /**
+ * {@link expect} the actual value to contain a specific value.
+ * @function
+ * @name matchers#toContain
+ * @since 2.0.0
+ * @param {Object} expected - The value to look for.
+ * @example
+ * expect(array).toContain(anElement);
+ * expect(string).toContain(substring);
+ */
+ function toContain(matchersUtil) {
+ return {
+ compare: function(actual, expected) {
+ return {
+ pass: matchersUtil.contains(actual, expected)
+ };
+ }
+ };
+ }
+
+ return toContain;
+};
+
+getJasmineRequireObj().toEqual = function(j$) {
+ /**
+ * {@link expect} the actual value to be equal to the expected, using deep equality comparison.
+ * @function
+ * @name matchers#toEqual
+ * @since 1.3.0
+ * @param {Object} expected - Expected value
+ * @example
+ * expect(bigObject).toEqual({"foo": ['bar', 'baz']});
+ */
+ function toEqual(matchersUtil) {
+ return {
+ compare: function(actual, expected) {
+ var result = {
+ pass: false
+ },
+ diffBuilder = j$.DiffBuilder({ prettyPrinter: matchersUtil.pp });
+
+ result.pass = matchersUtil.equals(actual, expected, diffBuilder);
+
+ // TODO: only set error message if test fails
+ result.message = diffBuilder.getMessage();
+
+ return result;
+ }
+ };
+ }
+
+ return toEqual;
+};
+
+getJasmineRequireObj().toHaveBeenCalled = function(j$) {
+ var getErrorMsg = j$.formatErrorMsg(
+ '<toHaveBeenCalled>',
+ 'expect(<spyObj>).toHaveBeenCalled()'
+ );
+
+ /**
+ * {@link expect} the actual (a {@link Spy}) to have been called.
+ * @function
+ * @name matchers#toHaveBeenCalled
+ * @since 1.3.0
+ * @example
+ * expect(mySpy).toHaveBeenCalled();
+ * expect(mySpy).not.toHaveBeenCalled();
+ */
+ function toHaveBeenCalled(matchersUtil) {
+ return {
+ compare: function(actual) {
+ var result = {};
+
+ if (!j$.isSpy(actual)) {
+ throw new Error(
+ getErrorMsg(
+ 'Expected a spy, but got ' + matchersUtil.pp(actual) + '.'
+ )
+ );
+ }
+
+ if (arguments.length > 1) {
+ throw new Error(
+ getErrorMsg('Does not take arguments, use toHaveBeenCalledWith')
+ );
+ }
+
+ result.pass = actual.calls.any();
+
+ result.message = result.pass
+ ? 'Expected spy ' + actual.and.identity + ' not to have been called.'
+ : 'Expected spy ' + actual.and.identity + ' to have been called.';
+
+ return result;
+ }
+ };
+ }
+
+ return toHaveBeenCalled;
+};
+
+getJasmineRequireObj().toHaveBeenCalledBefore = function(j$) {
+ var getErrorMsg = j$.formatErrorMsg(
+ '<toHaveBeenCalledBefore>',
+ 'expect(<spyObj>).toHaveBeenCalledBefore(<spyObj>)'
+ );
+
+ /**
+ * {@link expect} the actual value (a {@link Spy}) to have been called before another {@link Spy}.
+ * @function
+ * @name matchers#toHaveBeenCalledBefore
+ * @since 2.6.0
+ * @param {Spy} expected - {@link Spy} that should have been called after the `actual` {@link Spy}.
+ * @example
+ * expect(mySpy).toHaveBeenCalledBefore(otherSpy);
+ */
+ function toHaveBeenCalledBefore(matchersUtil) {
+ return {
+ compare: function(firstSpy, latterSpy) {
+ if (!j$.isSpy(firstSpy)) {
+ throw new Error(
+ getErrorMsg(
+ 'Expected a spy, but got ' + matchersUtil.pp(firstSpy) + '.'
+ )
+ );
+ }
+ if (!j$.isSpy(latterSpy)) {
+ throw new Error(
+ getErrorMsg(
+ 'Expected a spy, but got ' + matchersUtil.pp(latterSpy) + '.'
+ )
+ );
+ }
+
+ var result = { pass: false };
+
+ if (!firstSpy.calls.count()) {
+ result.message =
+ 'Expected spy ' + firstSpy.and.identity + ' to have been called.';
+ return result;
+ }
+ if (!latterSpy.calls.count()) {
+ result.message =
+ 'Expected spy ' + latterSpy.and.identity + ' to have been called.';
+ return result;
+ }
+
+ var latest1stSpyCall = firstSpy.calls.mostRecent().invocationOrder;
+ var first2ndSpyCall = latterSpy.calls.first().invocationOrder;
+
+ result.pass = latest1stSpyCall < first2ndSpyCall;
+
+ if (result.pass) {
+ result.message =
+ 'Expected spy ' +
+ firstSpy.and.identity +
+ ' to not have been called before spy ' +
+ latterSpy.and.identity +
+ ', but it was';
+ } else {
+ var first1stSpyCall = firstSpy.calls.first().invocationOrder;
+ var latest2ndSpyCall = latterSpy.calls.mostRecent().invocationOrder;
+
+ if (first1stSpyCall < first2ndSpyCall) {
+ result.message =
+ 'Expected latest call to spy ' +
+ firstSpy.and.identity +
+ ' to have been called before first call to spy ' +
+ latterSpy.and.identity +
+ ' (no interleaved calls)';
+ } else if (latest2ndSpyCall > latest1stSpyCall) {
+ result.message =
+ 'Expected first call to spy ' +
+ latterSpy.and.identity +
+ ' to have been called after latest call to spy ' +
+ firstSpy.and.identity +
+ ' (no interleaved calls)';
+ } else {
+ result.message =
+ 'Expected spy ' +
+ firstSpy.and.identity +
+ ' to have been called before spy ' +
+ latterSpy.and.identity;
+ }
+ }
+
+ return result;
+ }
+ };
+ }
+
+ return toHaveBeenCalledBefore;
+};
+
+getJasmineRequireObj().toHaveBeenCalledOnceWith = function(j$) {
+ var getErrorMsg = j$.formatErrorMsg(
+ '<toHaveBeenCalledOnceWith>',
+ 'expect(<spyObj>).toHaveBeenCalledOnceWith(...arguments)'
+ );
+
+ /**
+ * {@link expect} the actual (a {@link Spy}) to have been called exactly once, and exactly with the particular arguments.
+ * @function
+ * @name matchers#toHaveBeenCalledOnceWith
+ * @since 3.6.0
+ * @param {...Object} - The arguments to look for
+ * @example
+ * expect(mySpy).toHaveBeenCalledOnceWith('foo', 'bar', 2);
+ */
+ function toHaveBeenCalledOnceWith(util) {
+ return {
+ compare: function() {
+ var args = Array.prototype.slice.call(arguments, 0),
+ actual = args[0],
+ expectedArgs = args.slice(1);
+
+ if (!j$.isSpy(actual)) {
+ throw new Error(
+ getErrorMsg('Expected a spy, but got ' + util.pp(actual) + '.')
+ );
+ }
+
+ var prettyPrintedCalls = actual.calls
+ .allArgs()
+ .map(function(argsForCall) {
+ return ' ' + util.pp(argsForCall);
+ });
+
+ if (
+ actual.calls.count() === 1 &&
+ util.contains(actual.calls.allArgs(), expectedArgs)
+ ) {
+ return {
+ pass: true,
+ message:
+ 'Expected spy ' +
+ actual.and.identity +
+ ' to have been called 0 times, multiple times, or once, but with arguments different from:\n' +
+ ' ' +
+ util.pp(expectedArgs) +
+ '\n' +
+ 'But the actual call was:\n' +
+ prettyPrintedCalls.join(',\n') +
+ '.\n\n'
+ };
+ }
+
+ function getDiffs() {
+ return actual.calls.allArgs().map(function(argsForCall, callIx) {
+ var diffBuilder = new j$.DiffBuilder();
+ util.equals(argsForCall, expectedArgs, diffBuilder);
+ return diffBuilder.getMessage();
+ });
+ }
+
+ function butString() {
+ switch (actual.calls.count()) {
+ case 0:
+ return 'But it was never called.\n\n';
+ case 1:
+ return (
+ 'But the actual call was:\n' +
+ prettyPrintedCalls.join(',\n') +
+ '.\n' +
+ getDiffs().join('\n') +
+ '\n\n'
+ );
+ default:
+ return (
+ 'But the actual calls were:\n' +
+ prettyPrintedCalls.join(',\n') +
+ '.\n\n'
+ );
+ }
+ }
+
+ return {
+ pass: false,
+ message:
+ 'Expected spy ' +
+ actual.and.identity +
+ ' to have been called only once, and with given args:\n' +
+ ' ' +
+ util.pp(expectedArgs) +
+ '\n' +
+ butString()
+ };
+ }
+ };
+ }
+
+ return toHaveBeenCalledOnceWith;
+};
+
+getJasmineRequireObj().toHaveBeenCalledTimes = function(j$) {
+ var getErrorMsg = j$.formatErrorMsg(
+ '<toHaveBeenCalledTimes>',
+ 'expect(<spyObj>).toHaveBeenCalledTimes(<Number>)'
+ );
+
+ /**
+ * {@link expect} the actual (a {@link Spy}) to have been called the specified number of times.
+ * @function
+ * @name matchers#toHaveBeenCalledTimes
+ * @since 2.4.0
+ * @param {Number} expected - The number of invocations to look for.
+ * @example
+ * expect(mySpy).toHaveBeenCalledTimes(3);
+ */
+ function toHaveBeenCalledTimes(matchersUtil) {
+ return {
+ compare: function(actual, expected) {
+ if (!j$.isSpy(actual)) {
+ throw new Error(
+ getErrorMsg(
+ 'Expected a spy, but got ' + matchersUtil.pp(actual) + '.'
+ )
+ );
+ }
+
+ var args = Array.prototype.slice.call(arguments, 0),
+ result = { pass: false };
+
+ if (!j$.isNumber_(expected)) {
+ throw new Error(
+ getErrorMsg(
+ 'The expected times failed is a required argument and must be a number.'
+ )
+ );
+ }
+
+ actual = args[0];
+ var calls = actual.calls.count();
+ var timesMessage = expected === 1 ? 'once' : expected + ' times';
+ result.pass = calls === expected;
+ result.message = result.pass
+ ? 'Expected spy ' +
+ actual.and.identity +
+ ' not to have been called ' +
+ timesMessage +
+ '. It was called ' +
+ calls +
+ ' times.'
+ : 'Expected spy ' +
+ actual.and.identity +
+ ' to have been called ' +
+ timesMessage +
+ '. It was called ' +
+ calls +
+ ' times.';
+ return result;
+ }
+ };
+ }
+
+ return toHaveBeenCalledTimes;
+};
+
+getJasmineRequireObj().toHaveBeenCalledWith = function(j$) {
+ var getErrorMsg = j$.formatErrorMsg(
+ '<toHaveBeenCalledWith>',
+ 'expect(<spyObj>).toHaveBeenCalledWith(...arguments)'
+ );
+
+ /**
+ * {@link expect} the actual (a {@link Spy}) to have been called with particular arguments at least once.
+ * @function
+ * @name matchers#toHaveBeenCalledWith
+ * @since 1.3.0
+ * @param {...Object} - The arguments to look for
+ * @example
+ * expect(mySpy).toHaveBeenCalledWith('foo', 'bar', 2);
+ */
+ function toHaveBeenCalledWith(matchersUtil) {
+ return {
+ compare: function() {
+ var args = Array.prototype.slice.call(arguments, 0),
+ actual = args[0],
+ expectedArgs = args.slice(1),
+ result = { pass: false };
+
+ if (!j$.isSpy(actual)) {
+ throw new Error(
+ getErrorMsg(
+ 'Expected a spy, but got ' + matchersUtil.pp(actual) + '.'
+ )
+ );
+ }
+
+ if (!actual.calls.any()) {
+ result.message = function() {
+ return (
+ 'Expected spy ' +
+ actual.and.identity +
+ ' to have been called with:\n' +
+ ' ' +
+ matchersUtil.pp(expectedArgs) +
+ '\nbut it was never called.'
+ );
+ };
+ return result;
+ }
+
+ if (matchersUtil.contains(actual.calls.allArgs(), expectedArgs)) {
+ result.pass = true;
+ result.message = function() {
+ return (
+ 'Expected spy ' +
+ actual.and.identity +
+ ' not to have been called with:\n' +
+ ' ' +
+ matchersUtil.pp(expectedArgs) +
+ '\nbut it was.'
+ );
+ };
+ } else {
+ result.message = function() {
+ var prettyPrintedCalls = actual.calls
+ .allArgs()
+ .map(function(argsForCall) {
+ return ' ' + matchersUtil.pp(argsForCall);
+ });
+
+ var diffs = actual.calls
+ .allArgs()
+ .map(function(argsForCall, callIx) {
+ var diffBuilder = new j$.DiffBuilder();
+ matchersUtil.equals(argsForCall, expectedArgs, diffBuilder);
+ return (
+ 'Call ' +
+ callIx +
+ ':\n' +
+ diffBuilder.getMessage().replace(/^/gm, ' ')
+ );
+ });
+
+ return (
+ 'Expected spy ' +
+ actual.and.identity +
+ ' to have been called with:\n' +
+ ' ' +
+ matchersUtil.pp(expectedArgs) +
+ '\n' +
+ '' +
+ 'but actual calls were:\n' +
+ prettyPrintedCalls.join(',\n') +
+ '.\n\n' +
+ diffs.join('\n')
+ );
+ };
+ }
+
+ return result;
+ }
+ };
+ }
+
+ return toHaveBeenCalledWith;
+};
+
+getJasmineRequireObj().toHaveClass = function(j$) {
+ /**
+ * {@link expect} the actual value to be a DOM element that has the expected class
+ * @function
+ * @name matchers#toHaveClass
+ * @since 3.0.0
+ * @param {Object} expected - The class name to test for
+ * @example
+ * var el = document.createElement('div');
+ * el.className = 'foo bar baz';
+ * expect(el).toHaveClass('bar');
+ */
+ function toHaveClass(matchersUtil) {
+ return {
+ compare: function(actual, expected) {
+ if (!isElement(actual)) {
+ throw new Error(matchersUtil.pp(actual) + ' is not a DOM element');
+ }
+
+ return {
+ pass: actual.classList.contains(expected)
+ };
+ }
+ };
+ }
+
+ function isElement(maybeEl) {
+ return (
+ maybeEl && maybeEl.classList && j$.isFunction_(maybeEl.classList.contains)
+ );
+ }
+
+ return toHaveClass;
+};
+
+getJasmineRequireObj().toHaveSize = function(j$) {
+ /**
+ * {@link expect} the actual size to be equal to the expected, using array-like length or object keys size.
+ * @function
+ * @name matchers#toHaveSize
+ * @since 3.6.0
+ * @param {Object} expected - Expected size
+ * @example
+ * array = [1,2];
+ * expect(array).toHaveSize(2);
+ */
+ function toHaveSize() {
+ return {
+ compare: function(actual, expected) {
+ var result = {
+ pass: false
+ };
+
+ if (
+ j$.isA_('WeakSet', actual) ||
+ j$.isWeakMap(actual) ||
+ j$.isDataView(actual)
+ ) {
+ throw new Error('Cannot get size of ' + actual + '.');
+ }
+
+ if (j$.isSet(actual) || j$.isMap(actual)) {
+ result.pass = actual.size === expected;
+ } else if (isLength(actual.length)) {
+ result.pass = actual.length === expected;
+ } else {
+ result.pass = Object.keys(actual).length === expected;
+ }
+
+ return result;
+ }
+ };
+ }
+
+ var MAX_SAFE_INTEGER = Number.MAX_SAFE_INTEGER || 9007199254740991; // eslint-disable-line compat/compat
+ function isLength(value) {
+ return (
+ typeof value == 'number' &&
+ value > -1 &&
+ value % 1 === 0 &&
+ value <= MAX_SAFE_INTEGER
+ );
+ }
+
+ return toHaveSize;
+};
+
+getJasmineRequireObj().toMatch = function(j$) {
+ var getErrorMsg = j$.formatErrorMsg(
+ '<toMatch>',
+ 'expect(<expectation>).toMatch(<string> || <regexp>)'
+ );
+
+ /**
+ * {@link expect} the actual value to match a regular expression
+ * @function
+ * @name matchers#toMatch
+ * @since 1.3.0
+ * @param {RegExp|String} expected - Value to look for in the string.
+ * @example
+ * expect("my string").toMatch(/string$/);
+ * expect("other string").toMatch("her");
+ */
+ function toMatch() {
+ return {
+ compare: function(actual, expected) {
+ if (!j$.isString_(expected) && !j$.isA_('RegExp', expected)) {
+ throw new Error(getErrorMsg('Expected is not a String or a RegExp'));
+ }
+
+ var regexp = new RegExp(expected);
+
+ return {
+ pass: regexp.test(actual)
+ };
+ }
+ };
+ }
+
+ return toMatch;
+};
+
+getJasmineRequireObj().toThrow = function(j$) {
+ var getErrorMsg = j$.formatErrorMsg(
+ '<toThrow>',
+ 'expect(function() {<expectation>}).toThrow()'
+ );
+
+ /**
+ * {@link expect} a function to `throw` something.
+ * @function
+ * @name matchers#toThrow
+ * @since 2.0.0
+ * @param {Object} [expected] - Value that should be thrown. If not provided, simply the fact that something was thrown will be checked.
+ * @example
+ * expect(function() { return 'things'; }).toThrow('foo');
+ * expect(function() { return 'stuff'; }).toThrow();
+ */
+ function toThrow(matchersUtil) {
+ return {
+ compare: function(actual, expected) {
+ var result = { pass: false },
+ threw = false,
+ thrown;
+
+ if (typeof actual != 'function') {
+ throw new Error(getErrorMsg('Actual is not a Function'));
+ }
+
+ try {
+ actual();
+ } catch (e) {
+ threw = true;
+ thrown = e;
+ }
+
+ if (!threw) {
+ result.message = 'Expected function to throw an exception.';
+ return result;
+ }
+
+ if (arguments.length == 1) {
+ result.pass = true;
+ result.message = function() {
+ return (
+ 'Expected function not to throw, but it threw ' +
+ matchersUtil.pp(thrown) +
+ '.'
+ );
+ };
+
+ return result;
+ }
+
+ if (matchersUtil.equals(thrown, expected)) {
+ result.pass = true;
+ result.message = function() {
+ return (
+ 'Expected function not to throw ' +
+ matchersUtil.pp(expected) +
+ '.'
+ );
+ };
+ } else {
+ result.message = function() {
+ return (
+ 'Expected function to throw ' +
+ matchersUtil.pp(expected) +
+ ', but it threw ' +
+ matchersUtil.pp(thrown) +
+ '.'
+ );
+ };
+ }
+
+ return result;
+ }
+ };
+ }
+
+ return toThrow;
+};
+
+getJasmineRequireObj().toThrowError = function(j$) {
+ var getErrorMsg = j$.formatErrorMsg(
+ '<toThrowError>',
+ 'expect(function() {<expectation>}).toThrowError(<ErrorConstructor>, <message>)'
+ );
+
+ /**
+ * {@link expect} a function to `throw` an `Error`.
+ * @function
+ * @name matchers#toThrowError
+ * @since 2.0.0
+ * @param {Error} [expected] - `Error` constructor the object that was thrown needs to be an instance of. If not provided, `Error` will be used.
+ * @param {RegExp|String} [message] - The message that should be set on the thrown `Error`
+ * @example
+ * expect(function() { return 'things'; }).toThrowError(MyCustomError, 'message');
+ * expect(function() { return 'things'; }).toThrowError(MyCustomError, /bar/);
+ * expect(function() { return 'stuff'; }).toThrowError(MyCustomError);
+ * expect(function() { return 'other'; }).toThrowError(/foo/);
+ * expect(function() { return 'other'; }).toThrowError();
+ */
+ function toThrowError(matchersUtil) {
+ return {
+ compare: function(actual) {
+ var errorMatcher = getMatcher.apply(null, arguments),
+ thrown;
+
+ if (typeof actual != 'function') {
+ throw new Error(getErrorMsg('Actual is not a Function'));
+ }
+
+ try {
+ actual();
+ return fail('Expected function to throw an Error.');
+ } catch (e) {
+ thrown = e;
+ }
+
+ if (!j$.isError_(thrown)) {
+ return fail(function() {
+ return (
+ 'Expected function to throw an Error, but it threw ' +
+ matchersUtil.pp(thrown) +
+ '.'
+ );
+ });
+ }
+
+ return errorMatcher.match(thrown);
+ }
+ };
+
+ function getMatcher() {
+ var expected, errorType;
+
+ if (arguments[2]) {
+ errorType = arguments[1];
+ expected = arguments[2];
+ if (!isAnErrorType(errorType)) {
+ throw new Error(getErrorMsg('Expected error type is not an Error.'));
+ }
+
+ return exactMatcher(expected, errorType);
+ } else if (arguments[1]) {
+ expected = arguments[1];
+
+ if (isAnErrorType(arguments[1])) {
+ return exactMatcher(null, arguments[1]);
+ } else {
+ return exactMatcher(arguments[1], null);
+ }
+ } else {
+ return anyMatcher();
+ }
+ }
+
+ function anyMatcher() {
+ return {
+ match: function(error) {
+ return pass(
+ 'Expected function not to throw an Error, but it threw ' +
+ j$.fnNameFor(error) +
+ '.'
+ );
+ }
+ };
+ }
+
+ function exactMatcher(expected, errorType) {
+ if (expected && !isStringOrRegExp(expected)) {
+ if (errorType) {
+ throw new Error(
+ getErrorMsg('Expected error message is not a string or RegExp.')
+ );
+ } else {
+ throw new Error(
+ getErrorMsg('Expected is not an Error, string, or RegExp.')
+ );
+ }
+ }
+
+ function messageMatch(message) {
+ if (typeof expected == 'string') {
+ return expected == message;
+ } else {
+ return expected.test(message);
+ }
+ }
+
+ var errorTypeDescription = errorType
+ ? j$.fnNameFor(errorType)
+ : 'an exception';
+
+ function thrownDescription(thrown) {
+ var thrownName = errorType
+ ? j$.fnNameFor(thrown.constructor)
+ : 'an exception',
+ thrownMessage = '';
+
+ if (expected) {
+ thrownMessage = ' with message ' + matchersUtil.pp(thrown.message);
+ }
+
+ return thrownName + thrownMessage;
+ }
+
+ function messageDescription() {
+ if (expected === null) {
+ return '';
+ } else if (expected instanceof RegExp) {
+ return ' with a message matching ' + matchersUtil.pp(expected);
+ } else {
+ return ' with message ' + matchersUtil.pp(expected);
+ }
+ }
+
+ function matches(error) {
+ return (
+ (errorType === null || error instanceof errorType) &&
+ (expected === null || messageMatch(error.message))
+ );
+ }
+
+ return {
+ match: function(thrown) {
+ if (matches(thrown)) {
+ return pass(function() {
+ return (
+ 'Expected function not to throw ' +
+ errorTypeDescription +
+ messageDescription() +
+ '.'
+ );
+ });
+ } else {
+ return fail(function() {
+ return (
+ 'Expected function to throw ' +
+ errorTypeDescription +
+ messageDescription() +
+ ', but it threw ' +
+ thrownDescription(thrown) +
+ '.'
+ );
+ });
+ }
+ }
+ };
+ }
+
+ function isStringOrRegExp(potential) {
+ return potential instanceof RegExp || typeof potential == 'string';
+ }
+
+ function isAnErrorType(type) {
+ if (typeof type !== 'function') {
+ return false;
+ }
+
+ var Surrogate = function() {};
+ Surrogate.prototype = type.prototype;
+ return j$.isError_(new Surrogate());
+ }
+ }
+
+ function pass(message) {
+ return {
+ pass: true,
+ message: message
+ };
+ }
+
+ function fail(message) {
+ return {
+ pass: false,
+ message: message
+ };
+ }
+
+ return toThrowError;
+};
+
+getJasmineRequireObj().toThrowMatching = function(j$) {
+ var usageError = j$.formatErrorMsg(
+ '<toThrowMatching>',
+ 'expect(function() {<expectation>}).toThrowMatching(<Predicate>)'
+ );
+
+ /**
+ * {@link expect} a function to `throw` something matching a predicate.
+ * @function
+ * @name matchers#toThrowMatching
+ * @since 3.0.0
+ * @param {Function} predicate - A function that takes the thrown exception as its parameter and returns true if it matches.
+ * @example
+ * expect(function() { throw new Error('nope'); }).toThrowMatching(function(thrown) { return thrown.message === 'nope'; });
+ */
+ function toThrowMatching(matchersUtil) {
+ return {
+ compare: function(actual, predicate) {
+ var thrown;
+
+ if (typeof actual !== 'function') {
+ throw new Error(usageError('Actual is not a Function'));
+ }
+
+ if (typeof predicate !== 'function') {
+ throw new Error(usageError('Predicate is not a Function'));
+ }
+
+ try {
+ actual();
+ return fail('Expected function to throw an exception.');
+ } catch (e) {
+ thrown = e;
+ }
+
+ if (predicate(thrown)) {
+ return pass(
+ 'Expected function not to throw an exception matching a predicate.'
+ );
+ } else {
+ return fail(function() {
+ return (
+ 'Expected function to throw an exception matching a predicate, ' +
+ 'but it threw ' +
+ thrownDescription(thrown) +
+ '.'
+ );
+ });
+ }
+ }
+ };
+
+ function thrownDescription(thrown) {
+ if (thrown && thrown.constructor) {
+ return (
+ j$.fnNameFor(thrown.constructor) +
+ ' with message ' +
+ matchersUtil.pp(thrown.message)
+ );
+ } else {
+ return matchersUtil.pp(thrown);
+ }
+ }
+ }
+
+ function pass(message) {
+ return {
+ pass: true,
+ message: message
+ };
+ }
+
+ function fail(message) {
+ return {
+ pass: false,
+ message: message
+ };
+ }
+
+ return toThrowMatching;
+};
+
- getJasmineRequireObj().MockDate = function() {
++getJasmineRequireObj().MockDate = function(j$) {
+ function MockDate(global) {
+ var self = this;
+ var currentTime = 0;
+
+ if (!global || !global.Date) {
+ self.install = function() {};
+ self.tick = function() {};
+ self.uninstall = function() {};
+ return self;
+ }
+
+ var GlobalDate = global.Date;
+
+ self.install = function(mockDate) {
+ if (mockDate instanceof GlobalDate) {
+ currentTime = mockDate.getTime();
+ } else {
++ if (!j$.util.isUndefined(mockDate)) {
++ j$.getEnv().deprecated(
++ 'The argument to jasmine.clock().mockDate(), if specified, ' +
++ 'should be a Date instance. Passing anything other than a Date ' +
++ 'will be treated as an error in a future release.'
++ );
++ }
++
+ currentTime = new GlobalDate().getTime();
+ }
+
+ global.Date = FakeDate;
+ };
+
+ self.tick = function(millis) {
+ millis = millis || 0;
+ currentTime = currentTime + millis;
+ };
+
+ self.uninstall = function() {
+ currentTime = 0;
+ global.Date = GlobalDate;
+ };
+
+ createDateProperties();
+
+ return self;
+
+ function FakeDate() {
+ switch (arguments.length) {
+ case 0:
+ return new GlobalDate(currentTime);
+ case 1:
+ return new GlobalDate(arguments[0]);
+ case 2:
+ return new GlobalDate(arguments[0], arguments[1]);
+ case 3:
+ return new GlobalDate(arguments[0], arguments[1], arguments[2]);
+ case 4:
+ return new GlobalDate(
+ arguments[0],
+ arguments[1],
+ arguments[2],
+ arguments[3]
+ );
+ case 5:
+ return new GlobalDate(
+ arguments[0],
+ arguments[1],
+ arguments[2],
+ arguments[3],
+ arguments[4]
+ );
+ case 6:
+ return new GlobalDate(
+ arguments[0],
+ arguments[1],
+ arguments[2],
+ arguments[3],
+ arguments[4],
+ arguments[5]
+ );
+ default:
+ return new GlobalDate(
+ arguments[0],
+ arguments[1],
+ arguments[2],
+ arguments[3],
+ arguments[4],
+ arguments[5],
+ arguments[6]
+ );
+ }
+ }
+
+ function createDateProperties() {
+ FakeDate.prototype = GlobalDate.prototype;
+
+ FakeDate.now = function() {
+ if (GlobalDate.now) {
+ return currentTime;
+ } else {
+ throw new Error('Browser does not support Date.now()');
+ }
+ };
+
+ FakeDate.toSource = GlobalDate.toSource;
+ FakeDate.toString = GlobalDate.toString;
+ FakeDate.parse = GlobalDate.parse;
+ FakeDate.UTC = GlobalDate.UTC;
+ }
+ }
+
+ return MockDate;
+};
+
+getJasmineRequireObj().makePrettyPrinter = function(j$) {
+ function SinglePrettyPrintRun(customObjectFormatters, pp) {
+ this.customObjectFormatters_ = customObjectFormatters;
+ this.ppNestLevel_ = 0;
+ this.seen = [];
+ this.length = 0;
+ this.stringParts = [];
+ this.pp_ = pp;
+ }
+
+ function hasCustomToString(value) {
+ // value.toString !== Object.prototype.toString if value has no custom toString but is from another context (e.g.
+ // iframe, web worker)
+ try {
+ return (
+ j$.isFunction_(value.toString) &&
+ value.toString !== Object.prototype.toString &&
+ value.toString() !== Object.prototype.toString.call(value)
+ );
+ } catch (e) {
+ // The custom toString() threw.
+ return true;
+ }
+ }
+
+ SinglePrettyPrintRun.prototype.format = function(value) {
+ this.ppNestLevel_++;
+ try {
+ var customFormatResult = this.applyCustomFormatters_(value);
+
+ if (customFormatResult) {
+ this.emitScalar(customFormatResult);
+ } else if (j$.util.isUndefined(value)) {
+ this.emitScalar('undefined');
+ } else if (value === null) {
+ this.emitScalar('null');
+ } else if (value === 0 && 1 / value === -Infinity) {
+ this.emitScalar('-0');
+ } else if (value === j$.getGlobal()) {
+ this.emitScalar('<global>');
+ } else if (value.jasmineToString) {
+ this.emitScalar(value.jasmineToString(this.pp_));
+ } else if (typeof value === 'string') {
+ this.emitString(value);
+ } else if (j$.isSpy(value)) {
+ this.emitScalar('spy on ' + value.and.identity);
+ } else if (j$.isSpy(value.toString)) {
+ this.emitScalar('spy on ' + value.toString.and.identity);
+ } else if (value instanceof RegExp) {
+ this.emitScalar(value.toString());
+ } else if (typeof value === 'function') {
+ this.emitScalar('Function');
+ } else if (j$.isDomNode(value)) {
+ if (value.tagName) {
+ this.emitDomElement(value);
+ } else {
+ this.emitScalar('HTMLNode');
+ }
+ } else if (value instanceof Date) {
+ this.emitScalar('Date(' + value + ')');
+ } else if (j$.isSet(value)) {
+ this.emitSet(value);
+ } else if (j$.isMap(value)) {
+ this.emitMap(value);
+ } else if (j$.isTypedArray_(value)) {
+ this.emitTypedArray(value);
+ } else if (
+ value.toString &&
+ typeof value === 'object' &&
+ !j$.isArray_(value) &&
+ hasCustomToString(value)
+ ) {
+ try {
+ this.emitScalar(value.toString());
+ } catch (e) {
+ this.emitScalar('has-invalid-toString-method');
+ }
+ } else if (j$.util.arrayContains(this.seen, value)) {
+ this.emitScalar(
+ '<circular reference: ' +
+ (j$.isArray_(value) ? 'Array' : 'Object') +
+ '>'
+ );
+ } else if (j$.isArray_(value) || j$.isA_('Object', value)) {
+ this.seen.push(value);
+ if (j$.isArray_(value)) {
+ this.emitArray(value);
+ } else {
+ this.emitObject(value);
+ }
+ this.seen.pop();
+ } else {
+ this.emitScalar(value.toString());
+ }
+ } catch (e) {
+ if (this.ppNestLevel_ > 1 || !(e instanceof MaxCharsReachedError)) {
+ throw e;
+ }
+ } finally {
+ this.ppNestLevel_--;
+ }
+ };
+
+ SinglePrettyPrintRun.prototype.applyCustomFormatters_ = function(value) {
+ return customFormat(value, this.customObjectFormatters_);
+ };
+
+ SinglePrettyPrintRun.prototype.iterateObject = function(obj, fn) {
+ var objKeys = keys(obj, j$.isArray_(obj));
+ var isGetter = function isGetter(prop) {};
+
+ if (obj.__lookupGetter__) {
+ isGetter = function isGetter(prop) {
+ var getter = obj.__lookupGetter__(prop);
+ return !j$.util.isUndefined(getter) && getter !== null;
+ };
+ }
+ var length = Math.min(objKeys.length, j$.MAX_PRETTY_PRINT_ARRAY_LENGTH);
+ for (var i = 0; i < length; i++) {
+ var property = objKeys[i];
+ fn(property, isGetter(property));
+ }
+
+ return objKeys.length > length;
+ };
+
+ SinglePrettyPrintRun.prototype.emitScalar = function(value) {
+ this.append(value);
+ };
+
+ SinglePrettyPrintRun.prototype.emitString = function(value) {
+ this.append("'" + value + "'");
+ };
+
+ SinglePrettyPrintRun.prototype.emitArray = function(array) {
+ if (this.ppNestLevel_ > j$.MAX_PRETTY_PRINT_DEPTH) {
+ this.append('Array');
+ return;
+ }
+ var length = Math.min(array.length, j$.MAX_PRETTY_PRINT_ARRAY_LENGTH);
+ this.append('[ ');
+ for (var i = 0; i < length; i++) {
+ if (i > 0) {
+ this.append(', ');
+ }
+ this.format(array[i]);
+ }
+ if (array.length > length) {
+ this.append(', ...');
+ }
+
+ var self = this;
+ var first = array.length === 0;
+ var truncated = this.iterateObject(array, function(property, isGetter) {
+ if (first) {
+ first = false;
+ } else {
+ self.append(', ');
+ }
+
+ self.formatProperty(array, property, isGetter);
+ });
+
+ if (truncated) {
+ this.append(', ...');
+ }
+
+ this.append(' ]');
+ };
+
+ SinglePrettyPrintRun.prototype.emitSet = function(set) {
+ if (this.ppNestLevel_ > j$.MAX_PRETTY_PRINT_DEPTH) {
+ this.append('Set');
+ return;
+ }
+ this.append('Set( ');
+ var size = Math.min(set.size, j$.MAX_PRETTY_PRINT_ARRAY_LENGTH);
+ var i = 0;
+ set.forEach(function(value, key) {
+ if (i >= size) {
+ return;
+ }
+ if (i > 0) {
+ this.append(', ');
+ }
+ this.format(value);
+
+ i++;
+ }, this);
+ if (set.size > size) {
+ this.append(', ...');
+ }
+ this.append(' )');
+ };
+
+ SinglePrettyPrintRun.prototype.emitMap = function(map) {
+ if (this.ppNestLevel_ > j$.MAX_PRETTY_PRINT_DEPTH) {
+ this.append('Map');
+ return;
+ }
+ this.append('Map( ');
+ var size = Math.min(map.size, j$.MAX_PRETTY_PRINT_ARRAY_LENGTH);
+ var i = 0;
+ map.forEach(function(value, key) {
+ if (i >= size) {
+ return;
+ }
+ if (i > 0) {
+ this.append(', ');
+ }
+ this.format([key, value]);
+
+ i++;
+ }, this);
+ if (map.size > size) {
+ this.append(', ...');
+ }
+ this.append(' )');
+ };
+
+ SinglePrettyPrintRun.prototype.emitObject = function(obj) {
+ var ctor = obj.constructor,
+ constructorName;
+
+ constructorName =
+ typeof ctor === 'function' && obj instanceof ctor
+ ? j$.fnNameFor(obj.constructor)
+ : 'null';
+
+ this.append(constructorName);
+
+ if (this.ppNestLevel_ > j$.MAX_PRETTY_PRINT_DEPTH) {
+ return;
+ }
+
+ var self = this;
+ this.append('({ ');
+ var first = true;
+
+ var truncated = this.iterateObject(obj, function(property, isGetter) {
+ if (first) {
+ first = false;
+ } else {
+ self.append(', ');
+ }
+
+ self.formatProperty(obj, property, isGetter);
+ });
+
+ if (truncated) {
+ this.append(', ...');
+ }
+
+ this.append(' })');
+ };
+
+ SinglePrettyPrintRun.prototype.emitTypedArray = function(arr) {
+ var constructorName = j$.fnNameFor(arr.constructor),
+ limitedArray = Array.prototype.slice.call(
+ arr,
+ 0,
+ j$.MAX_PRETTY_PRINT_ARRAY_LENGTH
+ ),
+ itemsString = Array.prototype.join.call(limitedArray, ', ');
+
+ if (limitedArray.length !== arr.length) {
+ itemsString += ', ...';
+ }
+
+ this.append(constructorName + ' [ ' + itemsString + ' ]');
+ };
+
+ SinglePrettyPrintRun.prototype.emitDomElement = function(el) {
+ var tagName = el.tagName.toLowerCase(),
+ attrs = el.attributes,
+ i,
+ len = attrs.length,
+ out = '<' + tagName,
+ attr;
+
+ for (i = 0; i < len; i++) {
+ attr = attrs[i];
+ out += ' ' + attr.name;
+
+ if (attr.value !== '') {
+ out += '="' + attr.value + '"';
+ }
+ }
+
+ out += '>';
+
+ if (el.childElementCount !== 0 || el.textContent !== '') {
+ out += '...</' + tagName + '>';
+ }
+
+ this.append(out);
+ };
+
+ SinglePrettyPrintRun.prototype.formatProperty = function(
+ obj,
+ property,
+ isGetter
+ ) {
+ this.append(property);
+ this.append(': ');
+ if (isGetter) {
+ this.append('<getter>');
+ } else {
+ this.format(obj[property]);
+ }
+ };
+
+ SinglePrettyPrintRun.prototype.append = function(value) {
+ // This check protects us from the rare case where an object has overriden
+ // `toString()` with an invalid implementation (returning a non-string).
+ if (typeof value !== 'string') {
+ value = Object.prototype.toString.call(value);
+ }
+
+ var result = truncate(value, j$.MAX_PRETTY_PRINT_CHARS - this.length);
+ this.length += result.value.length;
+ this.stringParts.push(result.value);
+
+ if (result.truncated) {
+ throw new MaxCharsReachedError();
+ }
+ };
+
+ function truncate(s, maxlen) {
+ if (s.length <= maxlen) {
+ return { value: s, truncated: false };
+ }
+
+ s = s.substring(0, maxlen - 4) + ' ...';
+ return { value: s, truncated: true };
+ }
+
+ function MaxCharsReachedError() {
+ this.message =
+ 'Exceeded ' +
+ j$.MAX_PRETTY_PRINT_CHARS +
+ ' characters while pretty-printing a value';
+ }
+
+ MaxCharsReachedError.prototype = new Error();
+
+ function keys(obj, isArray) {
+ var allKeys = Object.keys
+ ? Object.keys(obj)
+ : (function(o) {
+ var keys = [];
+ for (var key in o) {
+ if (j$.util.has(o, key)) {
+ keys.push(key);
+ }
+ }
+ return keys;
+ })(obj);
+
+ if (!isArray) {
+ return allKeys;
+ }
+
+ if (allKeys.length === 0) {
+ return allKeys;
+ }
+
+ var extraKeys = [];
+ for (var i = 0; i < allKeys.length; i++) {
+ if (!/^[0-9]+$/.test(allKeys[i])) {
+ extraKeys.push(allKeys[i]);
+ }
+ }
+
+ return extraKeys;
+ }
+
+ function customFormat(value, customObjectFormatters) {
+ var i, result;
+
+ for (i = 0; i < customObjectFormatters.length; i++) {
+ result = customObjectFormatters[i](value);
+
+ if (result !== undefined) {
+ return result;
+ }
+ }
+ }
+
+ return function(customObjectFormatters) {
+ customObjectFormatters = customObjectFormatters || [];
+
+ var pp = function(value) {
+ var prettyPrinter = new SinglePrettyPrintRun(customObjectFormatters, pp);
+ prettyPrinter.format(value);
+ return prettyPrinter.stringParts.join('');
+ };
+
+ pp.customFormat_ = function(value) {
+ return customFormat(value, customObjectFormatters);
+ };
+
+ return pp;
+ };
+};
+
+getJasmineRequireObj().QueueRunner = function(j$) {
+ var nextid = 1;
+
+ function StopExecutionError() {}
+ StopExecutionError.prototype = new Error();
+ j$.StopExecutionError = StopExecutionError;
+
- function once(fn) {
++ function once(fn, onTwice) {
+ var called = false;
+ return function(arg) {
- if (!called) {
++ if (called) {
++ if (onTwice) {
++ onTwice();
++ }
++ } else {
+ called = true;
+ // Direct call using single parameter, because cleanup/next does not need more
+ fn(arg);
+ }
+ return null;
+ };
+ }
+
++ function fallbackOnMultipleDone() {
++ console.error(
++ new Error(
++ "An asynchronous function called its 'done' " +
++ 'callback more than once, in a QueueRunner without a onMultipleDone ' +
++ 'handler.'
++ )
++ );
++ }
++
+ function emptyFn() {}
+
+ function QueueRunner(attrs) {
+ this.id_ = nextid++;
+ var queueableFns = attrs.queueableFns || [];
+ this.queueableFns = queueableFns.concat(attrs.cleanupFns || []);
+ this.firstCleanupIx = queueableFns.length;
+ this.onComplete = attrs.onComplete || emptyFn;
+ this.clearStack =
+ attrs.clearStack ||
+ function(fn) {
+ fn();
+ };
+ this.onException = attrs.onException || emptyFn;
++ this.onMultipleDone = attrs.onMultipleDone || fallbackOnMultipleDone;
+ this.userContext = attrs.userContext || new j$.UserContext();
+ this.timeout = attrs.timeout || {
+ setTimeout: setTimeout,
+ clearTimeout: clearTimeout
+ };
+ this.fail = attrs.fail || emptyFn;
+ this.globalErrors = attrs.globalErrors || {
+ pushListener: emptyFn,
+ popListener: emptyFn
+ };
+ this.completeOnFirstError = !!attrs.completeOnFirstError;
+ this.errored = false;
+
+ if (typeof this.onComplete !== 'function') {
+ throw new Error('invalid onComplete ' + JSON.stringify(this.onComplete));
+ }
+ this.deprecated = attrs.deprecated;
+ }
+
+ QueueRunner.prototype.execute = function() {
+ var self = this;
+ this.handleFinalError = function(message, source, lineno, colno, error) {
+ // Older browsers would send the error as the first parameter. HTML5
+ // specifies the the five parameters above. The error instance should
+ // be preffered, otherwise the call stack would get lost.
+ self.onException(error || message);
+ };
+ this.globalErrors.pushListener(this.handleFinalError);
+ this.run(0);
+ };
+
+ QueueRunner.prototype.skipToCleanup = function(lastRanIndex) {
+ if (lastRanIndex < this.firstCleanupIx) {
+ this.run(this.firstCleanupIx);
+ } else {
+ this.run(lastRanIndex + 1);
+ }
+ };
+
+ QueueRunner.prototype.clearTimeout = function(timeoutId) {
+ Function.prototype.apply.apply(this.timeout.clearTimeout, [
+ j$.getGlobal(),
+ [timeoutId]
+ ]);
+ };
+
+ QueueRunner.prototype.setTimeout = function(fn, timeout) {
+ return Function.prototype.apply.apply(this.timeout.setTimeout, [
+ j$.getGlobal(),
+ [fn, timeout]
+ ]);
+ };
+
+ QueueRunner.prototype.attempt = function attempt(iterativeIndex) {
+ var self = this,
+ completedSynchronously = true,
+ handleError = function handleError(error) {
++ // TODO probably shouldn't next() right away here.
++ // That makes debugging async failures much more confusing.
+ onException(error);
+ },
+ cleanup = once(function cleanup() {
+ if (timeoutId !== void 0) {
+ self.clearTimeout(timeoutId);
+ }
+ self.globalErrors.popListener(handleError);
+ }),
- next = once(function next(err) {
- cleanup();
++ next = once(
++ function next(err) {
++ cleanup();
+
- if (j$.isError_(err)) {
- if (!(err instanceof StopExecutionError) && !err.jasmineMessage) {
- self.fail(err);
++ if (j$.isError_(err)) {
++ if (!(err instanceof StopExecutionError) && !err.jasmineMessage) {
++ self.fail(err);
++ }
++ self.errored = errored = true;
++ } else if (typeof err !== 'undefined' && !self.errored) {
++ self.deprecated(
++ 'Any argument passed to a done callback will be treated as an ' +
++ 'error in a future release. Call the done callback without ' +
++ "arguments if you don't want to trigger a spec failure."
++ );
+ }
- self.errored = errored = true;
- }
+
- function runNext() {
- if (self.completeOnFirstError && errored) {
- self.skipToCleanup(iterativeIndex);
- } else {
- self.run(iterativeIndex + 1);
++ function runNext() {
++ if (self.completeOnFirstError && errored) {
++ self.skipToCleanup(iterativeIndex);
++ } else {
++ self.run(iterativeIndex + 1);
++ }
+ }
- }
+
- if (completedSynchronously) {
- self.setTimeout(runNext);
- } else {
- runNext();
++ if (completedSynchronously) {
++ self.setTimeout(runNext);
++ } else {
++ runNext();
++ }
++ },
++ function() {
++ try {
++ if (!timedOut) {
++ self.onMultipleDone();
++ }
++ } catch (error) {
++ // Any error we catch here is probably due to a bug in Jasmine,
++ // and it's not likely to end up anywhere useful if we let it
++ // propagate. Log it so it can at least show up when debugging.
++ console.error(error);
++ }
+ }
- }),
++ ),
+ errored = false,
++ timedOut = false,
+ queueableFn = self.queueableFns[iterativeIndex],
+ timeoutId,
+ maybeThenable;
+
+ next.fail = function nextFail() {
+ self.fail.apply(null, arguments);
+ self.errored = errored = true;
+ next();
+ };
+
+ self.globalErrors.pushListener(handleError);
+
+ if (queueableFn.timeout !== undefined) {
+ var timeoutInterval = queueableFn.timeout || j$.DEFAULT_TIMEOUT_INTERVAL;
+ timeoutId = self.setTimeout(function() {
++ timedOut = true;
+ var error = new Error(
+ 'Timeout - Async function did not complete within ' +
+ timeoutInterval +
+ 'ms ' +
+ (queueableFn.timeout
+ ? '(custom timeout)'
+ : '(set by jasmine.DEFAULT_TIMEOUT_INTERVAL)')
+ );
++ // TODO Need to decide what to do about a successful completion after a
++ // timeout. That should probably not be a deprecation, and maybe not
++ // an error in 4.0. (But a diagnostic of some sort might be helpful.)
+ onException(error);
+ next();
+ }, timeoutInterval);
+ }
+
+ try {
+ if (queueableFn.fn.length === 0) {
+ maybeThenable = queueableFn.fn.call(self.userContext);
+
+ if (maybeThenable && j$.isFunction_(maybeThenable.then)) {
- maybeThenable.then(next, onPromiseRejection);
++ maybeThenable.then(
++ wrapInPromiseResolutionHandler(next),
++ onPromiseRejection
++ );
+ completedSynchronously = false;
+ return { completedSynchronously: false };
+ }
+ } else {
+ maybeThenable = queueableFn.fn.call(self.userContext, next);
+ this.diagnoseConflictingAsync_(queueableFn.fn, maybeThenable);
+ completedSynchronously = false;
+ return { completedSynchronously: false };
+ }
+ } catch (e) {
+ onException(e);
+ self.errored = errored = true;
+ }
+
+ cleanup();
+ return { completedSynchronously: true, errored: errored };
+
+ function onException(e) {
+ self.onException(e);
+ self.errored = errored = true;
+ }
+
+ function onPromiseRejection(e) {
+ onException(e);
+ next();
+ }
+ };
+
+ QueueRunner.prototype.run = function(recursiveIndex) {
+ var length = this.queueableFns.length,
+ self = this,
+ iterativeIndex;
+
+ for (
+ iterativeIndex = recursiveIndex;
+ iterativeIndex < length;
+ iterativeIndex++
+ ) {
+ var result = this.attempt(iterativeIndex);
+
+ if (!result.completedSynchronously) {
+ return;
+ }
+
+ self.errored = self.errored || result.errored;
+
+ if (this.completeOnFirstError && result.errored) {
+ this.skipToCleanup(iterativeIndex);
+ return;
+ }
+ }
+
+ this.clearStack(function() {
+ self.globalErrors.popListener(self.handleFinalError);
- self.onComplete(self.errored && new StopExecutionError());
++
++ if (self.errored) {
++ self.onComplete(new StopExecutionError());
++ } else {
++ self.onComplete();
++ }
+ });
+ };
+
+ QueueRunner.prototype.diagnoseConflictingAsync_ = function(fn, retval) {
++ var msg;
++
+ if (retval && j$.isFunction_(retval.then)) {
- // Issue a warning that matches the user's code
++ // Issue a warning that matches the user's code.
++ // Omit the stack trace because there's almost certainly no user code
++ // on the stack at this point.
+ if (j$.isAsyncFunction_(fn)) {
- this.deprecated(
++ msg =
+ 'An asynchronous before/it/after ' +
- 'function was defined with the async keyword but also took a ' +
- 'done callback. This is not supported and will stop working in' +
- ' the future. Either remove the done callback (recommended) or ' +
- 'remove the async keyword.'
- );
++ 'function was defined with the async keyword but also took a ' +
++ 'done callback. This is not supported and will stop working in' +
++ ' the future. Either remove the done callback (recommended) or ' +
++ 'remove the async keyword.';
+ } else {
- this.deprecated(
++ msg =
+ 'An asynchronous before/it/after ' +
- 'function took a done callback but also returned a promise. ' +
- 'This is not supported and will stop working in the future. ' +
- 'Either remove the done callback (recommended) or change the ' +
- 'function to not return a promise.'
- );
++ 'function took a done callback but also returned a promise. ' +
++ 'This is not supported and will stop working in the future. ' +
++ 'Either remove the done callback (recommended) or change the ' +
++ 'function to not return a promise.';
+ }
++
++ this.deprecated(msg, { omitStackTrace: true });
+ }
+ };
+
++ function wrapInPromiseResolutionHandler(fn) {
++ return function(maybeArg) {
++ if (j$.isError_(maybeArg)) {
++ fn(maybeArg);
++ } else {
++ fn();
++ }
++ };
++ }
++
+ return QueueRunner;
+};
+
+getJasmineRequireObj().ReportDispatcher = function(j$) {
- function ReportDispatcher(methods, queueRunnerFactory) {
++ function ReportDispatcher(methods, queueRunnerFactory, deprecated) {
+ var dispatchedMethods = methods || [];
+
+ for (var i = 0; i < dispatchedMethods.length; i++) {
+ var method = dispatchedMethods[i];
+ this[method] = (function(m) {
+ return function() {
+ dispatch(m, arguments);
+ };
+ })(method);
+ }
+
+ var reporters = [];
+ var fallbackReporter = null;
+
+ this.addReporter = function(reporter) {
+ reporters.push(reporter);
+ };
+
+ this.provideFallbackReporter = function(reporter) {
+ fallbackReporter = reporter;
+ };
+
+ this.clearReporters = function() {
+ reporters = [];
+ };
+
+ return this;
+
+ function dispatch(method, args) {
+ if (reporters.length === 0 && fallbackReporter !== null) {
+ reporters.push(fallbackReporter);
+ }
+ var onComplete = args[args.length - 1];
+ args = j$.util.argsToArray(args).splice(0, args.length - 1);
+ var fns = [];
+ for (var i = 0; i < reporters.length; i++) {
+ var reporter = reporters[i];
+ addFn(fns, reporter, method, args);
+ }
+
+ queueRunnerFactory({
+ queueableFns: fns,
+ onComplete: onComplete,
- isReporter: true
++ isReporter: true,
++ onMultipleDone: function() {
++ deprecated(
++ "An asynchronous reporter callback called its 'done' callback " +
++ 'more than once. This is a bug in the reporter callback in ' +
++ 'question. This will be treated as an error in a future ' +
++ 'version. See' +
++ '<https://jasmine.github.io/tutorials/upgrading_to_Jasmine_4.0#deprecations-due-to-calling-done-multiple-times> ' +
++ 'for more information.',
++ { ignoreRunnable: true }
++ );
++ }
+ });
+ }
+
+ function addFn(fns, reporter, method, args) {
+ var fn = reporter[method];
+ if (!fn) {
+ return;
+ }
+
+ var thisArgs = j$.util.cloneArgs(args);
+ if (fn.length <= 1) {
+ fns.push({
+ fn: function() {
+ return fn.apply(reporter, thisArgs);
+ }
+ });
+ } else {
+ fns.push({
+ fn: function(done) {
+ return fn.apply(reporter, thisArgs.concat([done]));
+ }
+ });
+ }
+ }
+ }
+
+ return ReportDispatcher;
+};
+
+getJasmineRequireObj().interface = function(jasmine, env) {
+ var jasmineInterface = {
+ /**
+ * Callback passed to parts of the Jasmine base interface.
+ *
+ * By default Jasmine assumes this function completes synchronously.
+ * If you have code that you need to test asynchronously, you can declare that you receive a `done` callback, return a Promise, or use the `async` keyword if it is supported in your environment.
+ * @callback implementationCallback
+ * @param {Function} [done] Used to specify to Jasmine that this callback is asynchronous and Jasmine should wait until it has been called before moving on.
+ * @returns {} Optionally return a Promise instead of using `done` to cause Jasmine to wait for completion.
+ */
+
+ /**
+ * Create a group of specs (often called a suite).
+ *
+ * Calls to `describe` can be nested within other calls to compose your suite as a tree.
+ * @name describe
+ * @since 1.3.0
+ * @function
+ * @global
+ * @param {String} description Textual description of the group
+ * @param {Function} specDefinitions Function for Jasmine to invoke that will define inner suites and specs
+ */
+ describe: function(description, specDefinitions) {
+ return env.describe(description, specDefinitions);
+ },
+
+ /**
+ * A temporarily disabled [`describe`]{@link describe}
+ *
+ * Specs within an `xdescribe` will be marked pending and not executed
+ * @name xdescribe
+ * @since 1.3.0
+ * @function
+ * @global
+ * @param {String} description Textual description of the group
+ * @param {Function} specDefinitions Function for Jasmine to invoke that will define inner suites and specs
+ */
+ xdescribe: function(description, specDefinitions) {
+ return env.xdescribe(description, specDefinitions);
+ },
+
+ /**
+ * A focused [`describe`]{@link describe}
+ *
+ * If suites or specs are focused, only those that are focused will be executed
+ * @see fit
+ * @name fdescribe
+ * @since 2.1.0
+ * @function
+ * @global
+ * @param {String} description Textual description of the group
+ * @param {Function} specDefinitions Function for Jasmine to invoke that will define inner suites and specs
+ */
+ fdescribe: function(description, specDefinitions) {
+ return env.fdescribe(description, specDefinitions);
+ },
+
+ /**
+ * Define a single spec. A spec should contain one or more {@link expect|expectations} that test the state of the code.
+ *
+ * A spec whose expectations all succeed will be passing and a spec with any failures will fail.
+ * The name `it` is a pronoun for the test target, not an abbreviation of anything. It makes the
+ * spec more readable by connecting the function name `it` and the argument `description` as a
+ * complete sentence.
+ * @name it
+ * @since 1.3.0
+ * @function
+ * @global
+ * @param {String} description Textual description of what this spec is checking
+ * @param {implementationCallback} [testFunction] Function that contains the code of your test. If not provided the test will be `pending`.
+ * @param {Int} [timeout={@link jasmine.DEFAULT_TIMEOUT_INTERVAL}] Custom timeout for an async spec.
+ * @see async
+ */
+ it: function() {
+ return env.it.apply(env, arguments);
+ },
+
+ /**
+ * A temporarily disabled [`it`]{@link it}
+ *
+ * The spec will report as `pending` and will not be executed.
+ * @name xit
+ * @since 1.3.0
+ * @function
+ * @global
+ * @param {String} description Textual description of what this spec is checking.
+ * @param {implementationCallback} [testFunction] Function that contains the code of your test. Will not be executed.
+ */
+ xit: function() {
+ return env.xit.apply(env, arguments);
+ },
+
+ /**
+ * A focused [`it`]{@link it}
+ *
+ * If suites or specs are focused, only those that are focused will be executed.
+ * @name fit
+ * @since 2.1.0
+ * @function
+ * @global
+ * @param {String} description Textual description of what this spec is checking.
+ * @param {implementationCallback} testFunction Function that contains the code of your test.
+ * @param {Int} [timeout={@link jasmine.DEFAULT_TIMEOUT_INTERVAL}] Custom timeout for an async spec.
+ * @see async
+ */
+ fit: function() {
+ return env.fit.apply(env, arguments);
+ },
+
+ /**
+ * Run some shared setup before each of the specs in the {@link describe} in which it is called.
+ * @name beforeEach
+ * @since 1.3.0
+ * @function
+ * @global
+ * @param {implementationCallback} [function] Function that contains the code to setup your specs.
+ * @param {Int} [timeout={@link jasmine.DEFAULT_TIMEOUT_INTERVAL}] Custom timeout for an async beforeEach.
+ * @see async
+ */
+ beforeEach: function() {
+ return env.beforeEach.apply(env, arguments);
+ },
+
+ /**
+ * Run some shared teardown after each of the specs in the {@link describe} in which it is called.
+ * @name afterEach
+ * @since 1.3.0
+ * @function
+ * @global
+ * @param {implementationCallback} [function] Function that contains the code to teardown your specs.
+ * @param {Int} [timeout={@link jasmine.DEFAULT_TIMEOUT_INTERVAL}] Custom timeout for an async afterEach.
+ * @see async
+ */
+ afterEach: function() {
+ return env.afterEach.apply(env, arguments);
+ },
+
+ /**
+ * Run some shared setup once before all of the specs in the {@link describe} are run.
+ *
+ * _Note:_ Be careful, sharing the setup from a beforeAll makes it easy to accidentally leak state between your specs so that they erroneously pass or fail.
+ * @name beforeAll
+ * @since 2.1.0
+ * @function
+ * @global
+ * @param {implementationCallback} [function] Function that contains the code to setup your specs.
+ * @param {Int} [timeout={@link jasmine.DEFAULT_TIMEOUT_INTERVAL}] Custom timeout for an async beforeAll.
+ * @see async
+ */
+ beforeAll: function() {
+ return env.beforeAll.apply(env, arguments);
+ },
+
+ /**
+ * Run some shared teardown once after all of the specs in the {@link describe} are run.
+ *
+ * _Note:_ Be careful, sharing the teardown from a afterAll makes it easy to accidentally leak state between your specs so that they erroneously pass or fail.
+ * @name afterAll
+ * @since 2.1.0
+ * @function
+ * @global
+ * @param {implementationCallback} [function] Function that contains the code to teardown your specs.
+ * @param {Int} [timeout={@link jasmine.DEFAULT_TIMEOUT_INTERVAL}] Custom timeout for an async afterAll.
+ * @see async
+ */
+ afterAll: function() {
+ return env.afterAll.apply(env, arguments);
+ },
+
+ /**
+ * Sets a user-defined property that will be provided to reporters as part of the properties field of {@link SpecResult}
+ * @name setSpecProperty
+ * @since 3.6.0
+ * @function
+ * @param {String} key The name of the property
+ * @param {*} value The value of the property
+ */
+ setSpecProperty: function(key, value) {
+ return env.setSpecProperty(key, value);
+ },
+
+ /**
+ * Sets a user-defined property that will be provided to reporters as part of the properties field of {@link SuiteResult}
+ * @name setSuiteProperty
+ * @since 3.6.0
+ * @function
+ * @param {String} key The name of the property
+ * @param {*} value The value of the property
+ */
+ setSuiteProperty: function(key, value) {
+ return env.setSuiteProperty(key, value);
+ },
+
+ /**
+ * Create an expectation for a spec.
+ * @name expect
+ * @since 1.3.0
+ * @function
+ * @global
+ * @param {Object} actual - Actual computed value to test expectations against.
+ * @return {matchers}
+ */
+ expect: function(actual) {
+ return env.expect(actual);
+ },
+
+ /**
+ * Create an asynchronous expectation for a spec. Note that the matchers
+ * that are provided by an asynchronous expectation all return promises
+ * which must be either returned from the spec or waited for using `await`
+ * in order for Jasmine to associate them with the correct spec.
+ * @name expectAsync
+ * @since 3.3.0
+ * @function
+ * @global
+ * @param {Object} actual - Actual computed value to test expectations against.
+ * @return {async-matchers}
+ * @example
+ * await expectAsync(somePromise).toBeResolved();
+ * @example
+ * return expectAsync(somePromise).toBeResolved();
+ */
+ expectAsync: function(actual) {
+ return env.expectAsync(actual);
+ },
+
+ /**
+ * Mark a spec as pending, expectation results will be ignored.
+ * @name pending
+ * @since 2.0.0
+ * @function
+ * @global
+ * @param {String} [message] - Reason the spec is pending.
+ */
+ pending: function() {
+ return env.pending.apply(env, arguments);
+ },
+
+ /**
+ * Explicitly mark a spec as failed.
+ * @name fail
+ * @since 2.1.0
+ * @function
+ * @global
+ * @param {String|Error} [error] - Reason for the failure.
+ */
+ fail: function() {
+ return env.fail.apply(env, arguments);
+ },
+
+ /**
+ * Install a spy onto an existing object.
+ * @name spyOn
+ * @since 1.3.0
+ * @function
+ * @global
+ * @param {Object} obj - The object upon which to install the {@link Spy}.
+ * @param {String} methodName - The name of the method to replace with a {@link Spy}.
+ * @returns {Spy}
+ */
+ spyOn: function(obj, methodName) {
+ return env.spyOn(obj, methodName);
+ },
+
+ /**
+ * Install a spy on a property installed with `Object.defineProperty` onto an existing object.
+ * @name spyOnProperty
+ * @since 2.6.0
+ * @function
+ * @global
+ * @param {Object} obj - The object upon which to install the {@link Spy}
+ * @param {String} propertyName - The name of the property to replace with a {@link Spy}.
+ * @param {String} [accessType=get] - The access type (get|set) of the property to {@link Spy} on.
+ * @returns {Spy}
+ */
+ spyOnProperty: function(obj, methodName, accessType) {
+ return env.spyOnProperty(obj, methodName, accessType);
+ },
+
+ /**
+ * Installs spies on all writable and configurable properties of an object.
+ * @name spyOnAllFunctions
+ * @since 3.2.1
+ * @function
+ * @global
+ * @param {Object} obj - The object upon which to install the {@link Spy}s
+ * @param {boolean} includeNonEnumerable - Whether or not to add spies to non-enumerable properties
+ * @returns {Object} the spied object
+ */
+ spyOnAllFunctions: function(obj, includeNonEnumerable) {
+ return env.spyOnAllFunctions(obj, includeNonEnumerable);
+ },
+
+ jsApiReporter: new jasmine.JsApiReporter({
+ timer: new jasmine.Timer()
+ }),
+
+ /**
+ * @namespace jasmine
+ */
+ jasmine: jasmine
+ };
+
+ /**
+ * Add a custom equality tester for the current scope of specs.
+ *
+ * _Note:_ This is only callable from within a {@link beforeEach}, {@link it}, or {@link beforeAll}.
+ * @name jasmine.addCustomEqualityTester
+ * @since 2.0.0
+ * @function
+ * @param {Function} tester - A function which takes two arguments to compare and returns a `true` or `false` comparison result if it knows how to compare them, and `undefined` otherwise.
+ * @see custom_equality
+ */
+ jasmine.addCustomEqualityTester = function(tester) {
+ env.addCustomEqualityTester(tester);
+ };
+
+ /**
+ * Add custom matchers for the current scope of specs.
+ *
+ * _Note:_ This is only callable from within a {@link beforeEach}, {@link it}, or {@link beforeAll}.
+ * @name jasmine.addMatchers
+ * @since 2.0.0
+ * @function
+ * @param {Object} matchers - Keys from this object will be the new matcher names.
+ * @see custom_matcher
+ */
+ jasmine.addMatchers = function(matchers) {
+ return env.addMatchers(matchers);
+ };
+
+ /**
+ * Add custom async matchers for the current scope of specs.
+ *
+ * _Note:_ This is only callable from within a {@link beforeEach}, {@link it}, or {@link beforeAll}.
+ * @name jasmine.addAsyncMatchers
+ * @since 3.5.0
+ * @function
+ * @param {Object} matchers - Keys from this object will be the new async matcher names.
+ * @see custom_matcher
+ */
+ jasmine.addAsyncMatchers = function(matchers) {
+ return env.addAsyncMatchers(matchers);
+ };
+
+ /**
+ * Add a custom object formatter for the current scope of specs.
+ *
+ * _Note:_ This is only callable from within a {@link beforeEach}, {@link it}, or {@link beforeAll}.
+ * @name jasmine.addCustomObjectFormatter
+ * @since 3.6.0
+ * @function
+ * @param {Function} formatter - A function which takes a value to format and returns a string if it knows how to format it, and `undefined` otherwise.
+ * @see custom_object_formatters
+ */
+ jasmine.addCustomObjectFormatter = function(formatter) {
+ return env.addCustomObjectFormatter(formatter);
+ };
+
+ /**
+ * Get the currently booted mock {Clock} for this Jasmine environment.
+ * @name jasmine.clock
+ * @since 2.0.0
+ * @function
+ * @returns {Clock}
+ */
+ jasmine.clock = function() {
+ return env.clock;
+ };
+
+ /**
+ * Create a bare {@link Spy} object. This won't be installed anywhere and will not have any implementation behind it.
+ * @name jasmine.createSpy
+ * @since 1.3.0
+ * @function
+ * @param {String} [name] - Name to give the spy. This will be displayed in failure messages.
+ * @param {Function} [originalFn] - Function to act as the real implementation.
+ * @return {Spy}
+ */
+ jasmine.createSpy = function(name, originalFn) {
+ return env.createSpy(name, originalFn);
+ };
+
+ /**
+ * Create an object with multiple {@link Spy}s as its members.
+ * @name jasmine.createSpyObj
+ * @since 1.3.0
+ * @function
+ * @param {String} [baseName] - Base name for the spies in the object.
+ * @param {String[]|Object} methodNames - Array of method names to create spies for, or Object whose keys will be method names and values the {@link Spy#and#returnValue|returnValue}.
+ * @param {String[]|Object} [propertyNames] - Array of property names to create spies for, or Object whose keys will be propertynames and values the {@link Spy#and#returnValue|returnValue}.
+ * @return {Object}
+ */
+ jasmine.createSpyObj = function(baseName, methodNames, propertyNames) {
+ return env.createSpyObj(baseName, methodNames, propertyNames);
+ };
+
+ /**
+ * Add a custom spy strategy for the current scope of specs.
+ *
+ * _Note:_ This is only callable from within a {@link beforeEach}, {@link it}, or {@link beforeAll}.
+ * @name jasmine.addSpyStrategy
+ * @since 3.5.0
+ * @function
+ * @param {String} name - The name of the strategy (i.e. what you call from `and`)
+ * @param {Function} factory - Factory function that returns the plan to be executed.
+ */
+ jasmine.addSpyStrategy = function(name, factory) {
+ return env.addSpyStrategy(name, factory);
+ };
+
+ /**
+ * Set the default spy strategy for the current scope of specs.
+ *
+ * _Note:_ This is only callable from within a {@link beforeEach}, {@link it}, or {@link beforeAll}.
+ * @name jasmine.setDefaultSpyStrategy
+ * @function
+ * @param {Function} defaultStrategyFn - a function that assigns a strategy
+ * @example
+ * beforeEach(function() {
+ * jasmine.setDefaultSpyStrategy(and => and.returnValue(true));
+ * });
+ */
+ jasmine.setDefaultSpyStrategy = function(defaultStrategyFn) {
+ return env.setDefaultSpyStrategy(defaultStrategyFn);
+ };
+
+ return jasmineInterface;
+};
+
+getJasmineRequireObj().Spy = function(j$) {
+ var nextOrder = (function() {
+ var order = 0;
+
+ return function() {
+ return order++;
+ };
+ })();
+
+ var matchersUtil = new j$.MatchersUtil({
+ customTesters: [],
+ pp: j$.makePrettyPrinter()
+ });
+
+ /**
+ * @classdesc _Note:_ Do not construct this directly. Use {@link spyOn},
+ * {@link spyOnProperty}, {@link jasmine.createSpy}, or
+ * {@link jasmine.createSpyObj} instead.
+ * @class Spy
+ * @hideconstructor
+ */
+ function Spy(
+ name,
+ originalFn,
+ customStrategies,
+ defaultStrategyFn,
+ getPromise
+ ) {
+ var numArgs = typeof originalFn === 'function' ? originalFn.length : 0,
+ wrapper = makeFunc(numArgs, function(context, args, invokeNew) {
+ return spy(context, args, invokeNew);
+ }),
+ strategyDispatcher = new SpyStrategyDispatcher({
+ name: name,
+ fn: originalFn,
+ getSpy: function() {
+ return wrapper;
+ },
+ customStrategies: customStrategies,
+ getPromise: getPromise
+ }),
+ callTracker = new j$.CallTracker(),
+ spy = function(context, args, invokeNew) {
+ /**
+ * @name Spy.callData
+ * @property {object} object - `this` context for the invocation.
+ * @property {number} invocationOrder - Order of the invocation.
+ * @property {Array} args - The arguments passed for this invocation.
+ * @property returnValue - The value that was returned from this invocation.
+ */
+ var callData = {
+ object: context,
+ invocationOrder: nextOrder(),
+ args: Array.prototype.slice.apply(args)
+ };
+
+ callTracker.track(callData);
+ var returnValue = strategyDispatcher.exec(context, args, invokeNew);
+ callData.returnValue = returnValue;
+
+ return returnValue;
+ };
+
+ function makeFunc(length, fn) {
+ switch (length) {
+ case 1:
+ return function wrap1(a) {
+ return fn(this, arguments, this instanceof wrap1);
+ };
+ case 2:
+ return function wrap2(a, b) {
+ return fn(this, arguments, this instanceof wrap2);
+ };
+ case 3:
+ return function wrap3(a, b, c) {
+ return fn(this, arguments, this instanceof wrap3);
+ };
+ case 4:
+ return function wrap4(a, b, c, d) {
+ return fn(this, arguments, this instanceof wrap4);
+ };
+ case 5:
+ return function wrap5(a, b, c, d, e) {
+ return fn(this, arguments, this instanceof wrap5);
+ };
+ case 6:
+ return function wrap6(a, b, c, d, e, f) {
+ return fn(this, arguments, this instanceof wrap6);
+ };
+ case 7:
+ return function wrap7(a, b, c, d, e, f, g) {
+ return fn(this, arguments, this instanceof wrap7);
+ };
+ case 8:
+ return function wrap8(a, b, c, d, e, f, g, h) {
+ return fn(this, arguments, this instanceof wrap8);
+ };
+ case 9:
+ return function wrap9(a, b, c, d, e, f, g, h, i) {
+ return fn(this, arguments, this instanceof wrap9);
+ };
+ default:
+ return function wrap() {
+ return fn(this, arguments, this instanceof wrap);
+ };
+ }
+ }
+
+ for (var prop in originalFn) {
+ if (prop === 'and' || prop === 'calls') {
+ throw new Error(
+ "Jasmine spies would overwrite the 'and' and 'calls' properties on the object being spied upon"
+ );
+ }
+
+ wrapper[prop] = originalFn[prop];
+ }
+
+ /**
+ * @member {SpyStrategy} - Accesses the default strategy for the spy. This strategy will be used
+ * whenever the spy is called with arguments that don't match any strategy
+ * created with {@link Spy#withArgs}.
+ * @name Spy#and
+ * @since 2.0.0
+ * @example
+ * spyOn(someObj, 'func').and.returnValue(42);
+ */
+ wrapper.and = strategyDispatcher.and;
+ /**
+ * Specifies a strategy to be used for calls to the spy that have the
+ * specified arguments.
+ * @name Spy#withArgs
+ * @since 3.0.0
+ * @function
+ * @param {...*} args - The arguments to match
+ * @type {SpyStrategy}
+ * @example
+ * spyOn(someObj, 'func').withArgs(1, 2, 3).and.returnValue(42);
+ * someObj.func(1, 2, 3); // returns 42
+ */
+ wrapper.withArgs = function() {
+ return strategyDispatcher.withArgs.apply(strategyDispatcher, arguments);
+ };
+ wrapper.calls = callTracker;
+
+ if (defaultStrategyFn) {
+ defaultStrategyFn(wrapper.and);
+ }
+
+ return wrapper;
+ }
+
+ function SpyStrategyDispatcher(strategyArgs) {
+ var baseStrategy = new j$.SpyStrategy(strategyArgs);
+ var argsStrategies = new StrategyDict(function() {
+ return new j$.SpyStrategy(strategyArgs);
+ });
+
+ this.and = baseStrategy;
+
+ this.exec = function(spy, args, invokeNew) {
+ var strategy = argsStrategies.get(args);
+
+ if (!strategy) {
+ if (argsStrategies.any() && !baseStrategy.isConfigured()) {
+ throw new Error(
+ "Spy '" +
+ strategyArgs.name +
+ "' received a call with arguments " +
- j$.pp(Array.prototype.slice.call(args)) +
++ j$.basicPrettyPrinter_(Array.prototype.slice.call(args)) +
+ ' but all configured strategies specify other arguments.'
+ );
+ } else {
+ strategy = baseStrategy;
+ }
+ }
+
+ return strategy.exec(spy, args, invokeNew);
+ };
+
+ this.withArgs = function() {
+ return { and: argsStrategies.getOrCreate(arguments) };
+ };
+ }
+
+ function StrategyDict(strategyFactory) {
+ this.strategies = [];
+ this.strategyFactory = strategyFactory;
+ }
+
+ StrategyDict.prototype.any = function() {
+ return this.strategies.length > 0;
+ };
+
+ StrategyDict.prototype.getOrCreate = function(args) {
+ var strategy = this.get(args);
+
+ if (!strategy) {
+ strategy = this.strategyFactory();
+ this.strategies.push({
+ args: args,
+ strategy: strategy
+ });
+ }
+
+ return strategy;
+ };
+
+ StrategyDict.prototype.get = function(args) {
+ var i;
+
+ for (i = 0; i < this.strategies.length; i++) {
+ if (matchersUtil.equals(args, this.strategies[i].args)) {
+ return this.strategies[i].strategy;
+ }
+ }
+ };
+
+ return Spy;
+};
+
+getJasmineRequireObj().SpyFactory = function(j$) {
+ function SpyFactory(getCustomStrategies, getDefaultStrategyFn, getPromise) {
+ var self = this;
+
+ this.createSpy = function(name, originalFn) {
+ return j$.Spy(
+ name,
+ originalFn,
+ getCustomStrategies(),
+ getDefaultStrategyFn(),
+ getPromise
+ );
+ };
+
+ this.createSpyObj = function(baseName, methodNames, propertyNames) {
+ var baseNameIsCollection =
+ j$.isObject_(baseName) || j$.isArray_(baseName);
+
+ if (baseNameIsCollection) {
+ propertyNames = methodNames;
+ methodNames = baseName;
+ baseName = 'unknown';
+ }
+
+ var obj = {};
+ var spy, descriptor;
+
+ var methods = normalizeKeyValues(methodNames);
+ for (var i = 0; i < methods.length; i++) {
+ spy = obj[methods[i][0]] = self.createSpy(
+ baseName + '.' + methods[i][0]
+ );
+ if (methods[i].length > 1) {
+ spy.and.returnValue(methods[i][1]);
+ }
+ }
+
+ var properties = normalizeKeyValues(propertyNames);
+ for (var i = 0; i < properties.length; i++) {
+ descriptor = {
+ enumerable: true,
+ get: self.createSpy(baseName + '.' + properties[i][0] + '.get'),
+ set: self.createSpy(baseName + '.' + properties[i][0] + '.set')
+ };
+ if (properties[i].length > 1) {
+ descriptor.get.and.returnValue(properties[i][1]);
+ descriptor.set.and.returnValue(properties[i][1]);
+ }
+ Object.defineProperty(obj, properties[i][0], descriptor);
+ }
+
+ if (methods.length === 0 && properties.length === 0) {
+ throw 'createSpyObj requires a non-empty array or object of method names to create spies for';
+ }
+
+ return obj;
+ };
+ }
+
+ function normalizeKeyValues(object) {
+ var result = [];
+ if (j$.isArray_(object)) {
+ for (var i = 0; i < object.length; i++) {
+ result.push([object[i]]);
+ }
+ } else if (j$.isObject_(object)) {
+ for (var key in object) {
+ if (object.hasOwnProperty(key)) {
+ result.push([key, object[key]]);
+ }
+ }
+ }
+ return result;
+ }
+
+ return SpyFactory;
+};
+
+getJasmineRequireObj().SpyRegistry = function(j$) {
+ var spyOnMsg = j$.formatErrorMsg('<spyOn>', 'spyOn(<object>, <methodName>)');
+ var spyOnPropertyMsg = j$.formatErrorMsg(
+ '<spyOnProperty>',
+ 'spyOnProperty(<object>, <propName>, [accessType])'
+ );
+
+ function SpyRegistry(options) {
+ options = options || {};
+ var global = options.global || j$.getGlobal();
+ var createSpy = options.createSpy;
+ var currentSpies =
+ options.currentSpies ||
+ function() {
+ return [];
+ };
+
+ this.allowRespy = function(allow) {
+ this.respy = allow;
+ };
+
+ this.spyOn = function(obj, methodName) {
+ var getErrorMsg = spyOnMsg;
+
+ if (j$.util.isUndefined(obj) || obj === null) {
+ throw new Error(
+ getErrorMsg(
+ 'could not find an object to spy upon for ' + methodName + '()'
+ )
+ );
+ }
+
+ if (j$.util.isUndefined(methodName) || methodName === null) {
+ throw new Error(getErrorMsg('No method name supplied'));
+ }
+
+ if (j$.util.isUndefined(obj[methodName])) {
+ throw new Error(getErrorMsg(methodName + '() method does not exist'));
+ }
+
+ if (obj[methodName] && j$.isSpy(obj[methodName])) {
+ if (this.respy) {
+ return obj[methodName];
+ } else {
+ throw new Error(
+ getErrorMsg(methodName + ' has already been spied upon')
+ );
+ }
+ }
+
+ var descriptor = Object.getOwnPropertyDescriptor(obj, methodName);
+
+ if (descriptor && !(descriptor.writable || descriptor.set)) {
+ throw new Error(
+ getErrorMsg(methodName + ' is not declared writable or has no setter')
+ );
+ }
+
+ var originalMethod = obj[methodName],
+ spiedMethod = createSpy(methodName, originalMethod),
+ restoreStrategy;
+
+ if (
+ Object.prototype.hasOwnProperty.call(obj, methodName) ||
+ (obj === global && methodName === 'onerror')
+ ) {
+ restoreStrategy = function() {
+ obj[methodName] = originalMethod;
+ };
+ } else {
+ restoreStrategy = function() {
+ if (!delete obj[methodName]) {
+ obj[methodName] = originalMethod;
+ }
+ };
+ }
+
+ currentSpies().push({
+ restoreObjectToOriginalState: restoreStrategy
+ });
+
+ obj[methodName] = spiedMethod;
+
+ return spiedMethod;
+ };
+
+ this.spyOnProperty = function(obj, propertyName, accessType) {
+ var getErrorMsg = spyOnPropertyMsg;
+
+ accessType = accessType || 'get';
+
+ if (j$.util.isUndefined(obj)) {
+ throw new Error(
+ getErrorMsg(
+ 'spyOn could not find an object to spy upon for ' +
+ propertyName +
+ ''
+ )
+ );
+ }
+
+ if (j$.util.isUndefined(propertyName)) {
+ throw new Error(getErrorMsg('No property name supplied'));
+ }
+
+ var descriptor = j$.util.getPropertyDescriptor(obj, propertyName);
+
+ if (!descriptor) {
+ throw new Error(getErrorMsg(propertyName + ' property does not exist'));
+ }
+
+ if (!descriptor.configurable) {
+ throw new Error(
+ getErrorMsg(propertyName + ' is not declared configurable')
+ );
+ }
+
+ if (!descriptor[accessType]) {
+ throw new Error(
+ getErrorMsg(
+ 'Property ' +
+ propertyName +
+ ' does not have access type ' +
+ accessType
+ )
+ );
+ }
+
+ if (j$.isSpy(descriptor[accessType])) {
+ if (this.respy) {
+ return descriptor[accessType];
+ } else {
+ throw new Error(
+ getErrorMsg(
+ propertyName + '#' + accessType + ' has already been spied upon'
+ )
+ );
+ }
+ }
+
+ var originalDescriptor = j$.util.clone(descriptor),
+ spy = createSpy(propertyName, descriptor[accessType]),
+ restoreStrategy;
+
+ if (Object.prototype.hasOwnProperty.call(obj, propertyName)) {
+ restoreStrategy = function() {
+ Object.defineProperty(obj, propertyName, originalDescriptor);
+ };
+ } else {
+ restoreStrategy = function() {
+ delete obj[propertyName];
+ };
+ }
+
+ currentSpies().push({
+ restoreObjectToOriginalState: restoreStrategy
+ });
+
+ descriptor[accessType] = spy;
+
+ Object.defineProperty(obj, propertyName, descriptor);
+
+ return spy;
+ };
+
+ this.spyOnAllFunctions = function(obj, includeNonEnumerable) {
+ if (j$.util.isUndefined(obj)) {
+ throw new Error(
+ 'spyOnAllFunctions could not find an object to spy upon'
+ );
+ }
+
+ var pointer = obj,
+ propsToSpyOn = [],
+ properties,
+ propertiesToSkip = [];
+
+ while (
+ pointer &&
+ (!includeNonEnumerable || pointer !== Object.prototype)
+ ) {
+ properties = getProps(pointer, includeNonEnumerable);
+ properties = properties.filter(function(prop) {
+ return propertiesToSkip.indexOf(prop) === -1;
+ });
+ propertiesToSkip = propertiesToSkip.concat(properties);
+ propsToSpyOn = propsToSpyOn.concat(
+ getSpyableFunctionProps(pointer, properties)
+ );
+ pointer = Object.getPrototypeOf(pointer);
+ }
+
+ for (var i = 0; i < propsToSpyOn.length; i++) {
+ this.spyOn(obj, propsToSpyOn[i]);
+ }
+
+ return obj;
+ };
+
+ this.clearSpies = function() {
+ var spies = currentSpies();
+ for (var i = spies.length - 1; i >= 0; i--) {
+ var spyEntry = spies[i];
+ spyEntry.restoreObjectToOriginalState();
+ }
+ };
+ }
+
+ function getProps(obj, includeNonEnumerable) {
+ var enumerableProperties = Object.keys(obj);
+
+ if (!includeNonEnumerable) {
+ return enumerableProperties;
+ }
+
+ return Object.getOwnPropertyNames(obj).filter(function(prop) {
+ return (
+ prop !== 'constructor' ||
+ enumerableProperties.indexOf('constructor') > -1
+ );
+ });
+ }
+
+ function getSpyableFunctionProps(obj, propertiesToCheck) {
+ var props = [],
+ prop;
+ for (var i = 0; i < propertiesToCheck.length; i++) {
+ prop = propertiesToCheck[i];
+ if (
+ Object.prototype.hasOwnProperty.call(obj, prop) &&
+ isSpyableProp(obj, prop)
+ ) {
+ props.push(prop);
+ }
+ }
+ return props;
+ }
+
+ function isSpyableProp(obj, prop) {
+ var value, descriptor;
+ try {
+ value = obj[prop];
+ } catch (e) {
+ return false;
+ }
+ if (value instanceof Function) {
+ descriptor = Object.getOwnPropertyDescriptor(obj, prop);
+ return (descriptor.writable || descriptor.set) && descriptor.configurable;
+ }
+ return false;
+ }
+
+ return SpyRegistry;
+};
+
+getJasmineRequireObj().SpyStrategy = function(j$) {
+ /**
+ * @interface SpyStrategy
+ */
+ function SpyStrategy(options) {
+ options = options || {};
+
+ var self = this;
+
+ /**
+ * Get the identifying information for the spy.
+ * @name SpyStrategy#identity
+ * @since 3.0.0
+ * @member
+ * @type {String}
+ */
+ this.identity = options.name || 'unknown';
+ this.originalFn = options.fn || function() {};
+ this.getSpy = options.getSpy || function() {};
+ this.plan = this._defaultPlan = function() {};
+
+ var k,
+ cs = options.customStrategies || {};
+ for (k in cs) {
+ if (j$.util.has(cs, k) && !this[k]) {
+ this[k] = createCustomPlan(cs[k]);
+ }
+ }
+
+ var getPromise =
+ typeof options.getPromise === 'function'
+ ? options.getPromise
+ : function() {};
+
+ var requirePromise = function(name) {
+ var Promise = getPromise();
+
+ if (!Promise) {
+ throw new Error(
+ name +
+ ' requires global Promise, or `Promise` configured with `jasmine.getEnv().configure()`'
+ );
+ }
+
+ return Promise;
+ };
+
+ /**
+ * Tell the spy to return a promise resolving to the specified value when invoked.
+ * @name SpyStrategy#resolveTo
+ * @since 3.5.0
+ * @function
+ * @param {*} value The value to return.
+ */
+ this.resolveTo = function(value) {
+ var Promise = requirePromise('resolveTo');
+ self.plan = function() {
+ return Promise.resolve(value);
+ };
+ return self.getSpy();
+ };
+
+ /**
+ * Tell the spy to return a promise rejecting with the specified value when invoked.
+ * @name SpyStrategy#rejectWith
+ * @since 3.5.0
+ * @function
+ * @param {*} value The value to return.
+ */
+ this.rejectWith = function(value) {
+ var Promise = requirePromise('rejectWith');
+
+ self.plan = function() {
+ return Promise.reject(value);
+ };
+ return self.getSpy();
+ };
+ }
+
+ function createCustomPlan(factory) {
+ return function() {
+ var plan = factory.apply(null, arguments);
+
+ if (!j$.isFunction_(plan)) {
+ throw new Error('Spy strategy must return a function');
+ }
+
+ this.plan = plan;
+ return this.getSpy();
+ };
+ }
+
+ /**
+ * Execute the current spy strategy.
+ * @name SpyStrategy#exec
+ * @since 2.0.0
+ * @function
+ */
+ SpyStrategy.prototype.exec = function(context, args, invokeNew) {
+ var contextArgs = [context].concat(
+ args ? Array.prototype.slice.call(args) : []
+ );
+ var target = this.plan.bind.apply(this.plan, contextArgs);
+
+ return invokeNew ? new target() : target();
+ };
+
+ /**
+ * Tell the spy to call through to the real implementation when invoked.
+ * @name SpyStrategy#callThrough
+ * @since 2.0.0
+ * @function
+ */
+ SpyStrategy.prototype.callThrough = function() {
+ this.plan = this.originalFn;
+ return this.getSpy();
+ };
+
+ /**
+ * Tell the spy to return the value when invoked.
+ * @name SpyStrategy#returnValue
+ * @since 2.0.0
+ * @function
+ * @param {*} value The value to return.
+ */
+ SpyStrategy.prototype.returnValue = function(value) {
+ this.plan = function() {
+ return value;
+ };
+ return this.getSpy();
+ };
+
+ /**
+ * Tell the spy to return one of the specified values (sequentially) each time the spy is invoked.
+ * @name SpyStrategy#returnValues
+ * @since 2.1.0
+ * @function
+ * @param {...*} values - Values to be returned on subsequent calls to the spy.
+ */
+ SpyStrategy.prototype.returnValues = function() {
+ var values = Array.prototype.slice.call(arguments);
+ this.plan = function() {
+ return values.shift();
+ };
+ return this.getSpy();
+ };
+
+ /**
+ * Tell the spy to throw an error when invoked.
+ * @name SpyStrategy#throwError
+ * @since 2.0.0
+ * @function
+ * @param {Error|Object|String} something Thing to throw
+ */
+ SpyStrategy.prototype.throwError = function(something) {
+ var error = j$.isString_(something) ? new Error(something) : something;
+ this.plan = function() {
+ throw error;
+ };
+ return this.getSpy();
+ };
+
+ /**
+ * Tell the spy to call a fake implementation when invoked.
+ * @name SpyStrategy#callFake
+ * @since 2.0.0
+ * @function
+ * @param {Function} fn The function to invoke with the passed parameters.
+ */
+ SpyStrategy.prototype.callFake = function(fn) {
+ if (
+ !(
+ j$.isFunction_(fn) ||
+ j$.isAsyncFunction_(fn) ||
+ j$.isGeneratorFunction_(fn)
+ )
+ ) {
+ throw new Error(
+ 'Argument passed to callFake should be a function, got ' + fn
+ );
+ }
+ this.plan = fn;
+ return this.getSpy();
+ };
+
+ /**
+ * Tell the spy to do nothing when invoked. This is the default.
+ * @name SpyStrategy#stub
+ * @since 2.0.0
+ * @function
+ */
+ SpyStrategy.prototype.stub = function(fn) {
+ this.plan = function() {};
+ return this.getSpy();
+ };
+
+ SpyStrategy.prototype.isConfigured = function() {
+ return this.plan !== this._defaultPlan;
+ };
+
+ return SpyStrategy;
+};
+
+getJasmineRequireObj().StackTrace = function(j$) {
+ function StackTrace(error) {
+ var lines = error.stack.split('\n').filter(function(line) {
+ return line !== '';
+ });
+
+ var extractResult = extractMessage(error.message, lines);
+
+ if (extractResult) {
+ this.message = extractResult.message;
+ lines = extractResult.remainder;
+ }
+
+ var parseResult = tryParseFrames(lines);
+ this.frames = parseResult.frames;
+ this.style = parseResult.style;
+ }
+
+ var framePatterns = [
+ // PhantomJS on Linux, Node, Chrome, IE, Edge
+ // e.g. " at QueueRunner.run (http://localhost:8888/__jasmine__/jasmine.js:4320:20)"
+ // Note that the "function name" can include a surprisingly large set of
+ // characters, including angle brackets and square brackets.
+ {
+ re: /^\s*at ([^\)]+) \(([^\)]+)\)$/,
+ fnIx: 1,
+ fileLineColIx: 2,
+ style: 'v8'
+ },
+
+ // NodeJS alternate form, often mixed in with the Chrome style
+ // e.g. " at /some/path:4320:20
+ { re: /\s*at (.+)$/, fileLineColIx: 1, style: 'v8' },
+
+ // PhantomJS on OS X, Safari, Firefox
+ // e.g. "run@http://localhost:8888/__jasmine__/jasmine.js:4320:27"
+ // or "http://localhost:8888/__jasmine__/jasmine.js:4320:27"
+ {
+ re: /^(([^@\s]+)@)?([^\s]+)$/,
+ fnIx: 2,
+ fileLineColIx: 3,
+ style: 'webkit'
+ }
+ ];
+
+ // regexes should capture the function name (if any) as group 1
+ // and the file, line, and column as group 2.
+ function tryParseFrames(lines) {
+ var style = null;
+ var frames = lines.map(function(line) {
+ var convertedLine = first(framePatterns, function(pattern) {
+ var overallMatch = line.match(pattern.re),
+ fileLineColMatch;
+ if (!overallMatch) {
+ return null;
+ }
+
+ fileLineColMatch = overallMatch[pattern.fileLineColIx].match(
+ /^(.*):(\d+):\d+$/
+ );
+ if (!fileLineColMatch) {
+ return null;
+ }
+
+ style = style || pattern.style;
+ return {
+ raw: line,
+ file: fileLineColMatch[1],
+ line: parseInt(fileLineColMatch[2], 10),
+ func: overallMatch[pattern.fnIx]
+ };
+ });
+
+ return convertedLine || { raw: line };
+ });
+
+ return {
+ style: style,
+ frames: frames
+ };
+ }
+
+ function first(items, fn) {
+ var i, result;
+
+ for (i = 0; i < items.length; i++) {
+ result = fn(items[i]);
+
+ if (result) {
+ return result;
+ }
+ }
+ }
+
+ function extractMessage(message, stackLines) {
+ var len = messagePrefixLength(message, stackLines);
+
+ if (len > 0) {
+ return {
+ message: stackLines.slice(0, len).join('\n'),
+ remainder: stackLines.slice(len)
+ };
+ }
+ }
+
+ function messagePrefixLength(message, stackLines) {
+ if (!stackLines[0].match(/^\w*Error/)) {
+ return 0;
+ }
+
+ var messageLines = message.split('\n');
+ var i;
+
+ for (i = 1; i < messageLines.length; i++) {
+ if (messageLines[i] !== stackLines[i]) {
+ return 0;
+ }
+ }
+
+ return messageLines.length;
+ }
+
+ return StackTrace;
+};
+
+getJasmineRequireObj().Suite = function(j$) {
+ /**
+ * @interface Suite
+ * @see Env#topSuite
+ * @since 2.0.0
+ */
+ function Suite(attrs) {
+ this.env = attrs.env;
+ /**
+ * The unique ID of this suite.
+ * @name Suite#id
+ * @readonly
+ * @type {string}
+ * @since 2.0.0
+ */
+ this.id = attrs.id;
+ /**
+ * The parent of this suite, or null if this is the top suite.
+ * @name Suite#parentSuite
+ * @readonly
+ * @type {Suite}
+ */
+ this.parentSuite = attrs.parentSuite;
+ /**
+ * The description passed to the {@link describe} that created this suite.
+ * @name Suite#description
+ * @readonly
+ * @type {string}
+ * @since 2.0.0
+ */
+ this.description = attrs.description;
+ this.expectationFactory = attrs.expectationFactory;
+ this.asyncExpectationFactory = attrs.asyncExpectationFactory;
+ this.expectationResultFactory = attrs.expectationResultFactory;
+ this.throwOnExpectationFailure = !!attrs.throwOnExpectationFailure;
+ this.autoCleanClosures =
+ attrs.autoCleanClosures === undefined ? true : !!attrs.autoCleanClosures;
+
+ this.beforeFns = [];
+ this.afterFns = [];
+ this.beforeAllFns = [];
+ this.afterAllFns = [];
+
+ this.timer = attrs.timer || new j$.Timer();
+
+ /**
+ * The suite's children.
+ * @name Suite#children
+ * @type {Array.<(Spec|Suite)>}
+ * @since 2.0.0
+ */
+ this.children = [];
+
+ this.reset();
+ }
+
+ Suite.prototype.setSuiteProperty = function(key, value) {
+ this.result.properties = this.result.properties || {};
+ this.result.properties[key] = value;
+ };
+
+ Suite.prototype.expect = function(actual) {
+ return this.expectationFactory(actual, this);
+ };
+
+ Suite.prototype.expectAsync = function(actual) {
+ return this.asyncExpectationFactory(actual, this);
+ };
+
+ /**
+ * The full description including all ancestors of this suite.
+ * @name Suite#getFullName
+ * @function
+ * @returns {string}
+ * @since 2.0.0
+ */
+ Suite.prototype.getFullName = function() {
+ var fullName = [];
+ for (
+ var parentSuite = this;
+ parentSuite;
+ parentSuite = parentSuite.parentSuite
+ ) {
+ if (parentSuite.parentSuite) {
+ fullName.unshift(parentSuite.description);
+ }
+ }
+ return fullName.join(' ');
+ };
+
+ /*
+ * Mark the suite with "pending" status
+ */
+ Suite.prototype.pend = function() {
+ this.markedPending = true;
+ };
+
+ /*
+ * Like {@link Suite#pend}, but pending state will survive {@link Spec#reset}
+ * Useful for fdescribe, xdescribe, where pending state should remain.
+ */
+ Suite.prototype.exclude = function() {
+ this.pend();
+ this.markedExcluding = true;
+ };
+
+ Suite.prototype.beforeEach = function(fn) {
+ this.beforeFns.unshift(fn);
+ };
+
+ Suite.prototype.beforeAll = function(fn) {
+ this.beforeAllFns.push(fn);
+ };
+
+ Suite.prototype.afterEach = function(fn) {
+ this.afterFns.unshift(fn);
+ };
+
+ Suite.prototype.afterAll = function(fn) {
+ this.afterAllFns.unshift(fn);
+ };
+
+ Suite.prototype.startTimer = function() {
+ this.timer.start();
+ };
+
+ Suite.prototype.endTimer = function() {
+ this.result.duration = this.timer.elapsed();
+ };
+
+ function removeFns(queueableFns) {
+ for (var i = 0; i < queueableFns.length; i++) {
+ queueableFns[i].fn = null;
+ }
+ }
+
+ Suite.prototype.cleanupBeforeAfter = function() {
+ if (this.autoCleanClosures) {
+ removeFns(this.beforeAllFns);
+ removeFns(this.afterAllFns);
+ removeFns(this.beforeFns);
+ removeFns(this.afterFns);
+ }
+ };
+
+ Suite.prototype.reset = function() {
+ /**
+ * @typedef SuiteResult
+ * @property {Int} id - The unique id of this suite.
+ * @property {String} description - The description text passed to the {@link describe} that made this suite.
+ * @property {String} fullName - The full description including all ancestors of this suite.
+ * @property {Expectation[]} failedExpectations - The list of expectations that failed in an {@link afterAll} for this suite.
+ * @property {Expectation[]} deprecationWarnings - The list of deprecation warnings that occurred on this suite.
+ * @property {String} status - Once the suite has completed, this string represents the pass/fail status of this suite.
+ * @property {number} duration - The time in ms for Suite execution, including any before/afterAll, before/afterEach.
+ * @property {Object} properties - User-supplied properties, if any, that were set using {@link Env#setSuiteProperty}
+ * @since 2.0.0
+ */
+ this.result = {
+ id: this.id,
+ description: this.description,
+ fullName: this.getFullName(),
+ failedExpectations: [],
+ deprecationWarnings: [],
+ duration: null,
+ properties: null
+ };
+ this.markedPending = this.markedExcluding;
+ this.children.forEach(function(child) {
+ child.reset();
+ });
+ };
+
+ Suite.prototype.addChild = function(child) {
+ this.children.push(child);
+ };
+
+ Suite.prototype.status = function() {
+ if (this.markedPending) {
+ return 'pending';
+ }
+
+ if (this.result.failedExpectations.length > 0) {
+ return 'failed';
+ } else {
+ return 'passed';
+ }
+ };
+
+ Suite.prototype.canBeReentered = function() {
+ return this.beforeAllFns.length === 0 && this.afterAllFns.length === 0;
+ };
+
+ Suite.prototype.getResult = function() {
+ this.result.status = this.status();
+ return this.result;
+ };
+
+ Suite.prototype.sharedUserContext = function() {
+ if (!this.sharedContext) {
+ this.sharedContext = this.parentSuite
+ ? this.parentSuite.clonedSharedUserContext()
+ : new j$.UserContext();
+ }
+
+ return this.sharedContext;
+ };
+
+ Suite.prototype.clonedSharedUserContext = function() {
+ return j$.UserContext.fromExisting(this.sharedUserContext());
+ };
+
+ Suite.prototype.onException = function() {
+ if (arguments[0] instanceof j$.errors.ExpectationFailed) {
+ return;
+ }
+
+ var data = {
+ matcherName: '',
+ passed: false,
+ expected: '',
+ actual: '',
+ error: arguments[0]
+ };
+ var failedExpectation = this.expectationResultFactory(data);
+
+ if (!this.parentSuite) {
+ failedExpectation.globalErrorType = 'afterAll';
+ }
+
+ this.result.failedExpectations.push(failedExpectation);
+ };
+
++ Suite.prototype.onMultipleDone = function() {
++ var msg;
++
++ // Issue a deprecation. Include the context ourselves and pass
++ // ignoreRunnable: true, since getting here always means that we've already
++ // moved on and the current runnable isn't the one that caused the problem.
++ if (this.parentSuite) {
++ msg =
++ "An asynchronous function called its 'done' callback more than " +
++ 'once. This is a bug in the spec, beforeAll, beforeEach, afterAll, ' +
++ 'or afterEach function in question. This will be treated as an error ' +
++ 'in a future version. See' +
++ '<https://jasmine.github.io/tutorials/upgrading_to_Jasmine_4.0#deprecations-due-to-calling-done-multiple-times> ' +
++ 'for more information.\n' +
++ '(in suite: ' +
++ this.getFullName() +
++ ')';
++ } else {
++ msg =
++ 'A top-level beforeAll or afterAll function called its ' +
++ "'done' callback more than once. This is a bug in the beforeAll " +
++ 'or afterAll function in question. This will be treated as an ' +
++ 'error in a future version. See' +
++ '<https://jasmine.github.io/tutorials/upgrading_to_Jasmine_4.0#deprecations-due-to-calling-done-multiple-times> ' +
++ 'for more information.';
++ }
++
++ this.env.deprecated(msg, { ignoreRunnable: true });
++ };
++
+ Suite.prototype.addExpectationResult = function() {
+ if (isFailure(arguments)) {
+ var data = arguments[1];
+ this.result.failedExpectations.push(this.expectationResultFactory(data));
+ if (this.throwOnExpectationFailure) {
+ throw new j$.errors.ExpectationFailed();
+ }
+ }
+ };
+
+ Suite.prototype.addDeprecationWarning = function(deprecation) {
+ if (typeof deprecation === 'string') {
+ deprecation = { message: deprecation };
+ }
+ this.result.deprecationWarnings.push(
+ this.expectationResultFactory(deprecation)
+ );
+ };
+
+ function isFailure(args) {
+ return !args[0];
+ }
+
+ return Suite;
+};
+
+if (typeof window == void 0 && typeof exports == 'object') {
+ /* globals exports */
+ exports.Suite = jasmineRequire.Suite;
+}
+
+getJasmineRequireObj().Timer = function() {
+ var defaultNow = (function(Date) {
+ return function() {
+ return new Date().getTime();
+ };
+ })(Date);
+
+ function Timer(options) {
+ options = options || {};
+
+ var now = options.now || defaultNow,
+ startTime;
+
+ this.start = function() {
+ startTime = now();
+ };
+
+ this.elapsed = function() {
+ return now() - startTime;
+ };
+ }
+
+ return Timer;
+};
+
+getJasmineRequireObj().TreeProcessor = function() {
+ function TreeProcessor(attrs) {
+ var tree = attrs.tree,
+ runnableIds = attrs.runnableIds,
+ queueRunnerFactory = attrs.queueRunnerFactory,
+ nodeStart = attrs.nodeStart || function() {},
+ nodeComplete = attrs.nodeComplete || function() {},
+ failSpecWithNoExpectations = !!attrs.failSpecWithNoExpectations,
+ orderChildren =
+ attrs.orderChildren ||
+ function(node) {
+ return node.children;
+ },
+ excludeNode =
+ attrs.excludeNode ||
+ function(node) {
+ return false;
+ },
+ stats = { valid: true },
+ processed = false,
+ defaultMin = Infinity,
+ defaultMax = 1 - Infinity;
+
+ this.processTree = function() {
+ processNode(tree, true);
+ processed = true;
+ return stats;
+ };
+
+ this.execute = function(done) {
+ if (!processed) {
+ this.processTree();
+ }
+
+ if (!stats.valid) {
+ throw 'invalid order';
+ }
+
+ var childFns = wrapChildren(tree, 0);
+
+ queueRunnerFactory({
+ queueableFns: childFns,
+ userContext: tree.sharedUserContext(),
+ onException: function() {
+ tree.onException.apply(tree, arguments);
+ },
- onComplete: done
++ onComplete: done,
++ onMultipleDone: tree.onMultipleDone
++ ? tree.onMultipleDone.bind(tree)
++ : null
+ });
+ };
+
+ function runnableIndex(id) {
+ for (var i = 0; i < runnableIds.length; i++) {
+ if (runnableIds[i] === id) {
+ return i;
+ }
+ }
+ }
+
+ function processNode(node, parentExcluded) {
+ var executableIndex = runnableIndex(node.id);
+
+ if (executableIndex !== undefined) {
+ parentExcluded = false;
+ }
+
+ if (!node.children) {
+ var excluded = parentExcluded || excludeNode(node);
+ stats[node.id] = {
+ excluded: excluded,
+ willExecute: !excluded && !node.markedPending,
+ segments: [
+ {
+ index: 0,
+ owner: node,
+ nodes: [node],
+ min: startingMin(executableIndex),
+ max: startingMax(executableIndex)
+ }
+ ]
+ };
+ } else {
+ var hasExecutableChild = false;
+
+ var orderedChildren = orderChildren(node);
+
+ for (var i = 0; i < orderedChildren.length; i++) {
+ var child = orderedChildren[i];
+
+ processNode(child, parentExcluded);
+
+ if (!stats.valid) {
+ return;
+ }
+
+ var childStats = stats[child.id];
+
+ hasExecutableChild = hasExecutableChild || childStats.willExecute;
+ }
+
+ stats[node.id] = {
+ excluded: parentExcluded,
+ willExecute: hasExecutableChild
+ };
+
+ segmentChildren(node, orderedChildren, stats[node.id], executableIndex);
+
+ if (!node.canBeReentered() && stats[node.id].segments.length > 1) {
+ stats = { valid: false };
+ }
+ }
+ }
+
+ function startingMin(executableIndex) {
+ return executableIndex === undefined ? defaultMin : executableIndex;
+ }
+
+ function startingMax(executableIndex) {
+ return executableIndex === undefined ? defaultMax : executableIndex;
+ }
+
+ function segmentChildren(
+ node,
+ orderedChildren,
+ nodeStats,
+ executableIndex
+ ) {
+ var currentSegment = {
+ index: 0,
+ owner: node,
+ nodes: [],
+ min: startingMin(executableIndex),
+ max: startingMax(executableIndex)
+ },
+ result = [currentSegment],
+ lastMax = defaultMax,
+ orderedChildSegments = orderChildSegments(orderedChildren);
+
+ function isSegmentBoundary(minIndex) {
+ return (
+ lastMax !== defaultMax &&
+ minIndex !== defaultMin &&
+ lastMax < minIndex - 1
+ );
+ }
+
+ for (var i = 0; i < orderedChildSegments.length; i++) {
+ var childSegment = orderedChildSegments[i],
+ maxIndex = childSegment.max,
+ minIndex = childSegment.min;
+
+ if (isSegmentBoundary(minIndex)) {
+ currentSegment = {
+ index: result.length,
+ owner: node,
+ nodes: [],
+ min: defaultMin,
+ max: defaultMax
+ };
+ result.push(currentSegment);
+ }
+
+ currentSegment.nodes.push(childSegment);
+ currentSegment.min = Math.min(currentSegment.min, minIndex);
+ currentSegment.max = Math.max(currentSegment.max, maxIndex);
+ lastMax = maxIndex;
+ }
+
+ nodeStats.segments = result;
+ }
+
+ function orderChildSegments(children) {
+ var specifiedOrder = [],
+ unspecifiedOrder = [];
+
+ for (var i = 0; i < children.length; i++) {
+ var child = children[i],
+ segments = stats[child.id].segments;
+
+ for (var j = 0; j < segments.length; j++) {
+ var seg = segments[j];
+
+ if (seg.min === defaultMin) {
+ unspecifiedOrder.push(seg);
+ } else {
+ specifiedOrder.push(seg);
+ }
+ }
+ }
+
+ specifiedOrder.sort(function(a, b) {
+ return a.min - b.min;
+ });
+
+ return specifiedOrder.concat(unspecifiedOrder);
+ }
+
+ function executeNode(node, segmentNumber) {
+ if (node.children) {
+ return {
+ fn: function(done) {
+ var onStart = {
+ fn: function(next) {
+ nodeStart(node, next);
+ }
+ };
+
+ queueRunnerFactory({
+ onComplete: function() {
+ var args = Array.prototype.slice.call(arguments, [0]);
+ node.cleanupBeforeAfter();
+ nodeComplete(node, node.getResult(), function() {
+ done.apply(undefined, args);
+ });
+ },
+ queueableFns: [onStart].concat(wrapChildren(node, segmentNumber)),
+ userContext: node.sharedUserContext(),
+ onException: function() {
+ node.onException.apply(node, arguments);
- }
++ },
++ onMultipleDone: node.onMultipleDone
++ ? node.onMultipleDone.bind(node)
++ : null
+ });
+ }
+ };
+ } else {
+ return {
+ fn: function(done) {
+ node.execute(
+ done,
+ stats[node.id].excluded,
+ failSpecWithNoExpectations
+ );
+ }
+ };
+ }
+ }
+
+ function wrapChildren(node, segmentNumber) {
+ var result = [],
+ segmentChildren = stats[node.id].segments[segmentNumber].nodes;
+
+ for (var i = 0; i < segmentChildren.length; i++) {
+ result.push(
+ executeNode(segmentChildren[i].owner, segmentChildren[i].index)
+ );
+ }
+
+ if (!stats[node.id].willExecute) {
+ return result;
+ }
+
+ return node.beforeAllFns.concat(result).concat(node.afterAllFns);
+ }
+ }
+
+ return TreeProcessor;
+};
+
+getJasmineRequireObj().UserContext = function(j$) {
+ function UserContext() {}
+
+ UserContext.fromExisting = function(oldContext) {
+ var context = new UserContext();
+
+ for (var prop in oldContext) {
+ if (oldContext.hasOwnProperty(prop)) {
+ context[prop] = oldContext[prop];
+ }
+ }
+
+ return context;
+ };
+
+ return UserContext;
+};
+
+getJasmineRequireObj().version = function() {
- return '3.10.1';
++ return '3.99.1';
+};
--- /dev/null
- curl -o jasmine.js https://raw.githubusercontent.com/jasmine/jasmine/v3.10.1/lib/jasmine-core/jasmine.js
- patch <local-modifications.patch jasmine.js
+# This script is used to build our custom version of the Jasmine library by
+# downloading the upstream file and applying our patches, and is meant for use
+# only when upgrading to a new upstream version.
++curl -o jasmine.js https://raw.githubusercontent.com/jasmine/jasmine/v3.99.1/lib/jasmine-core/jasmine.js
++# patch <local-modifications.patch jasmine.js
--- /dev/null
- project('jasmine-gjs', version: '3.10.1', license: 'MIT',
++project('jasmine-gjs', version: '3.99.1', license: 'MIT',
+ meson_version: '>= 0.58.0')
+
+gjs_dep = dependency('gjs-1.0', required: false)
+if gjs_dep.found()
+ gjs = find_program(gjs_dep.get_variable('gjs_console'))
+else
+ gjs = find_program('gjs', 'gjs-console')
+endif
+
+pkglibexecdir = join_paths(get_option('libexecdir'), meson.project_name())
+pkgdatadir = join_paths(get_option('datadir'), meson.project_name())
+jasmine_mod = meson.project_name()
+
+uninstalled_pkglibexecdir = meson.current_build_dir()
+uninstalled_pkgdatadir = join_paths(meson.current_source_dir(), 'src')
+uninstalled_jasmine_mod = 'lib'
+
+# Executables
+
+config = configuration_data()
+if meson.is_subproject()
+ config.set('pkgdatadir', uninstalled_pkgdatadir)
+ config.set('pkglibexecdir', uninstalled_pkglibexecdir)
+ config.set('jasmine_mod', uninstalled_jasmine_mod)
+else
+ config.set('pkgdatadir', join_paths(get_option('prefix'), pkgdatadir))
+ config.set('pkglibexecdir', join_paths(get_option('prefix'), pkglibexecdir))
+ config.set('jasmine_mod', jasmine_mod)
+endif
+config.set('PACKAGE_VERSION', meson.project_version())
+
+jasmine = configure_file(configuration: config, input: 'bin/jasmine.in',
+ output: 'jasmine', install: not meson.is_subproject(), install_dir: 'bin')
+
- jasmine_runner = configure_file(configuration: config,
++configure_file(configuration: config,
+ input: 'bin/jasmine-runner.in', output: 'jasmine-runner',
+ install: not meson.is_subproject(),
+ install_dir: pkglibexecdir)
+
+meson.override_find_program('jasmine', jasmine)
+
+# Source code and Jasmine library
+
+if not meson.is_subproject()
+ install_data(
+ 'lib/jasmine.js',
+ 'src/command.js',
+ 'src/config.js',
+ 'src/consoleReporter.js',
+ 'src/jasmineBoot.js',
+ 'src/junitReporter.js',
+ 'src/options.js',
+ 'src/tapReporter.js',
+ 'src/timer.js',
+ 'src/utils.js',
+ 'src/verboseReporter.js',
+ 'src/xmlWriter.js',
+ install_dir: pkgdatadir,
+ )
+endif
+
+# Documentation
+
+if not meson.is_subproject()
+ install_data('jasmine.man', rename: 'jasmine.1',
+ install_dir: join_paths(get_option('datadir'), 'man', 'man1'))
+endif
+
+# Tests
+
+tests = [
++ '0_your_first_suite',
++ 'custom_matcher',
++
+ 'commandSpec',
+ 'configSpec',
+ 'consoleReporterSpec',
+ 'defaultReporterSpec',
- 'focusedSpecIntegrationTest',
+ 'importerSpec',
+ 'jasmineBootSpec',
- 'jasmineIntegrationTest',
+ 'junitReporterSpec',
+ 'optionsSpec',
+ 'tapReporterSpec',
+ 'timerSpec',
+ 'utilsSpec',
+ 'verboseReporterSpec',
+ 'xmlWriterSpec',
+]
+if not meson.is_subproject()
+ test_env = environment()
+ test_env.set('TEST_PKGDATADIR', uninstalled_pkgdatadir)
+ test_env.set('TEST_PKGLIBEXECDIR', uninstalled_pkglibexecdir)
+ test_env.set('TEST_JASMINE_MOD', uninstalled_jasmine_mod)
+ foreach t : tests
+ test_file = files('test/@0@.js'.format(t))
+ test(t, gjs, args: ['-m', jasmine, test_file, '--module', '--tap', '--no-config'],
+ env: test_env, protocol: 'tap')
+ endforeach
+endif
--- /dev/null
- - [ ] If making a new major release, update `test/jasmineIntegrationTest.js` and `test/focusedSpecIntegrationTest.js` from `https://github.com/jasmine/jasmine.github.io/tree/master/_versions/<VERSION>/src`.
- Currently we use `introduction.js`, `custom_equality.js`, `custom_matcher.js`, and `focused_specs.js`, but there may be new features that should be included as well.
- Strip the documentation comments and the weird indentation.
+# Release Checklist #
+
+## Updating to a new upstream release ##
+
+- [ ] Bump version in `meson.build`.
+- [ ] Change upstream Jasmine version in the `lib/update-jasmine.sh` script.
+- [ ] Delete `lib/jasmine.js`.
+- [ ] Run `cd lib; ./update-jasmine.sh` to regenerate `lib/jasmine.js` from the new upstream version.
+- [ ] Resolve patch conflicts with the new upstream version if necessary.
- ## Releasing: OBS ##
++- [ ] If making a new major release, update `test/jasmineIntegrationTest.js` and `test/focusedSpecIntegrationTest.js` from the appropriate point in the history of `https://github.com/jasmine/jasmine.github.io/tree/d9b48e17/_tutorials/src`.
++ Currently we use `0_your_first_suite.js` and `custom_matcher.js`, but there may be new features that should be included as well.
++ Remove the browser feature detection and put the "long asynchronous suite" test inside a check for an environment variable.
+- [ ] If making a new major release, see if there are any new features that we can use to improve jasmine-gjs's own tests.
+- [ ] Run `meson test`.
+- [ ] Make a commit.
+- [ ] Write release notes in `NEWS.md`.
+
+## Packaging: RPM ##
+
+- [ ] Update the version number in `jasmine-gjs.spec`.
+- [ ] Add a changelog entry in `jasmine-gjs.spec`.
+- [ ] Make any other necessary changes to `jasmine-gjs.spec`.
+- [ ] Run `ninja dist`.
+- [ ] Copy `jasmine-gjs-<VERSION>.tar.xz` to `rpmbuild/SOURCES`.
+- [ ] Copy `jasmine-gjs.spec` to `rpmbuild/SPECS`.
+- [ ] Run `rpmbuild -ba /path/to/rpmbuild/SPECS/jasmine-gjs.spec` to ensure that everything builds OK.
+- [ ] Make a commit.
+
+## Packaging: Debian ##
+
+- [ ] Update the changelog with `dch`. (Distribution = `unstable`)
+- [ ] Make any other necessary changes to the `debian` directory.
+- [ ] Run `debuild -uc -us -b` to ensure that everything builds OK.
+- [ ] Make a commit.
+- [ ] Run `ninja dist`.
+- [ ] Copy `jasmine-gjs-<VERSION>.tar.xz` to `../jasmine-gjs_<VERSION>.orig.tar.xz`.
+- [ ] Extract the tarball.
+- [ ] Enter the directory and run `debuild -uc -us -S` to build a source package.
+
- - [ ] On [OBS](https://build.opensuse.org/project/repositories/home:ptomato), check if repositories should be enabled for any new Fedora, Ubuntu, Debian, or OpenSUSE distribution releases.
- - [ ] Copy `jasmine-gjs-<VERSION>.tar.xz`, `jasmine-gjs.spec`, `jasmine-gjs_<VERSION>.orig.tar.xz`, `jasmine-gjs_<VERSION>-1.debian.tar.xz`, and `jasmine-gjs_<VERSION>-1.dsc` into an OBS checkout of the `home:ptomato/jasmine-gjs` project.
- - [ ] Remove the files in the OBS checkout that are from the previous version.
- - [ ] Run `osc addremove`.
- - [ ] Run `osc commit`.
- - [ ] Check that all builds passed.
-
- ## Releasing: Other ##
-
- - [ ] Add `jasmine-gjs-<VERSION>.tar.xz` to the `downloads` directory in the `ptomato/ptomato.github.com` repository.
- - [ ] Modify `opensource/jasmine/jasmine.md` to point to the newest version.
- - [ ] Make a commit.
- - [ ] Back in the `jasmine-gjs` repository, run `git tag <VERSION>`; version is just dotted numbers, e.g. `2.2.1`, no `v` or `Version`.
++## Releasing ##
+
++- [ ] Run `git tag <VERSION>`; version is just dotted numbers, e.g. `2.2.1`, no `v` or `Version`.
+- [ ] Push the tag to GitHub.
+- [ ] Copy the release notes from `NEWS.md` into https://github.com/ptomato/jasmine-gjs/releases
+- [ ] Attach the tarball and the sha256sum from the `meson-dist` directory to the release notes.
++- [ ] Attach the RPM packages from `/path/to/rpmbuild/RPMS/` and `/path/to/rpmbuild/SRPMS` to the release notes.
++- [ ] Attach the Debian packages (`jasmine-gjs_<VERSION>-1_all.deb`, `jasmine-gjs_<VERSION>.orig.tar.xz`, `jasmine-gjs_<VERSION>-1.debian.tar.xz`, and `jasmine-gjs_<VERSION>-1.dsc`) to the release notes.
--- /dev/null
- const fdstream = new Gio.UnixOutputStream({
+import Gio from 'gi://Gio';
+import GObject from 'gi://GObject';
+
+import {indenter} from './utils.js';
+
+const YELLOW = '\x1b[33m';
+const GREEN = '\x1b[32m';
+const RED = '\x1b[31m';
+const NORMAL = '\x1b[0m';
+
++let GioUnix = null;
++try {
++ GioUnix = (await import('gi://GioUnix')).default;
++} catch (e) {}
++
+function createNoopTimer() {
+ return {
+ start() {},
+ elapsed() {
+ return 0;
+ },
+ };
+}
+
+export const ConsoleReporter = GObject.registerClass({
+ Properties: {
+ 'show-colors': GObject.ParamSpec.boolean('show-colors', 'Show colors',
+ 'Whether to print color output',
+ GObject.ParamFlags.READWRITE | GObject.ParamFlags.CONSTRUCT_ONLY,
+ true),
+ 'jasmine-core-path': GObject.ParamSpec.string('jasmine-core-path',
+ 'Jasmine core path',
+ 'Path to Jasmine core module for stack trace purposes',
+ GObject.ParamFlags.READWRITE,
+ '/nowhere'),
+ },
+
+ Signals: {
+ 'started': {},
+ 'complete': {
+ param_types: [GObject.TYPE_BOOLEAN],
+ },
+ },
+}, class ConsoleReporter extends GObject.Object {
+ _init(props = {}) {
+ if (props.hasOwnProperty('print')) {
+ this._print = props.print;
+ delete props.print;
+ }
+
+ this._timerFactory = createNoopTimer;
+ if (props.hasOwnProperty('timerFactory')) {
+ this._timerFactory = props.timerFactory;
+ delete props.timerFactory;
+ }
+
+ super._init(props);
+
+ // The main timer should return 0 if the run hasn't started yet
+ this._timers = {
+ 'main': createNoopTimer(),
+ };
+
+ this._failedSpecs = [];
+ this._failedSuites = [];
+ this._suiteLevel = 0;
+ this._specCount = 0;
+ this._passingCount = 0;
+ this._failureCount = 0;
+ this._pendingCount = 0;
+ }
+
+ _color(str, color) {
+ if (typeof color !== 'undefined')
+ return this.show_colors ? color + str + NORMAL : str;
+ return str;
+ }
+
+ // default print function that prints to stdout (GJS' built-in print
+ // functions, print() and printerr(), unfortunately append newlines to
+ // everything)
+ static getStdout() {
+ if (!this._stdout) {
++ const UnixOutputStream = GioUnix
++ ? GioUnix.OutputStream
++ : Gio.UnixOutputStream;
+ const FD_STDOUT = 1;
++ const fdstream = new UnixOutputStream({
+ fd: FD_STDOUT,
+ close_fd: false,
+ });
+ this._stdout = new Gio.DataOutputStream({
+ base_stream: fdstream,
+ });
+ }
+ return this._stdout;
+ }
+
+ _print(str) {
+ ConsoleReporter.getStdout().put_string(str, null);
+ }
+
+ // Used to start a timer associated with a particular ID. Subclasses can use
+ // this to time actions that the base class doesn't time if they wish.
+ startTimer(id) {
+ this._timers[id] = this._timerFactory(id);
+ this._timers[id].start();
+ }
+
+ // Used to get the elapsed time from a timer with the given ID. Subclasses
+ // can use this to time actions not timed by the base class. The base class
+ // uses timers with the following IDs:
+ // main - times the whole suite
+ // suite:foo - times the suite with ID "foo"
+ // spec:bar - times the spec with ID "bar"
+ elapsedTime(id) {
+ return this._timers[id].elapsed();
+ }
+
+ // Called with an "info" object with the following property:
+ // totalSpecsDefined - number of specs to be run
+ jasmineStarted() {
+ this.emit('started');
+ this.startTimer('main');
+ }
+
+ jasmineDone() {
+ this.elapsedTime('main'); // Stop the timer
+ this.emit('complete', this._failureCount === 0);
+ }
+
+ // Called with a "result" object with the following properties:
+ // id - a string unique to this suite
+ // description - the name of the suite passed to describe()
+ // fullName - the full name including the names of parent suites
+ // failedExpectations - a list of failures in this suite
+ suiteStarted(result) {
+ if (result.id)
+ this.startTimer(`suite:${result.id}`);
+ this._suiteLevel++;
+ }
+
+ // Called with the same object as suiteStarted(), with an extra property:
+ // status - "disabled", "failed", or "finished"
+ // Adds another extra property if the suite was started properly with ID:
+ // time - time taken to execute the suite, in milliseconds
+ suiteDone(result) {
+ this._suiteLevel--;
+ if (result.failedExpectations && result.failedExpectations.length > 0) {
+ this._failureCount++;
+ this._failedSuites.push(result);
+ }
+ if (result.id)
+ result.time = this.elapsedTime(`suite:${result.id}`);
+ }
+
+ // Called with a "result" object with the following properties:
+ // id - a string unique to this spec
+ // description: the name of the spec passed to it()
+ // fullName - the full name concatenated with the suite's full name
+ // failedExpectations - a list of failures in this spec
+ // passedExpectations - a list of succeeded expectations in this spec
+ specStarted(result) {
+ if (result.id)
+ this.startTimer(`spec:${result.id}`);
+ this._specCount++;
+ }
+
+ // Called with the same object as specStarted(), with an extra property:
+ // status - "disabled", "pending", "failed", or "passed"
+ // Adds another extra property if the spec was started properly with ID:
+ // time - time taken to execute the spec, in milliseconds
+ specDone(result) {
+ if (result.status === 'passed') {
+ this._passingCount++;
+ } else if (result.status === 'pending') {
+ this._pendingCount++;
+ } else if (result.status === 'failed') {
+ this._failureCount++;
+ this._failedSpecs.push(result);
+ }
+ if (result.id)
+ result.time = this.elapsedTime(`spec:${result.id}`);
+ }
+
+ filterStack(stack) {
+ return stack.split('\n').filter(stackLine => {
+ return stackLine.indexOf(this.jasmine_core_path) === -1;
+ }).join('\n');
+ }
+});
+
+// This reporter has very nearly the same behaviour to Jasmine's default console
+// reporter.
+export const DefaultReporter = GObject.registerClass(class DefaultReporter extends ConsoleReporter {
+ jasmineStarted(info) {
+ super.jasmineStarted(info);
+ this._print('Started\n');
+ }
+
+ jasmineDone() {
+ this._print('\n\n');
+ if (this._failedSpecs.length > 0)
+ this._print('Failures:');
+ this._failedSpecs.forEach(this._printSpecFailureDetails, this);
+
+ if (this._specCount > 0) {
+ this._print('\n');
+ this._print(`${this._specCount} spec${this._specCount === 1 ? '' : 's'}, ${this._failureCount} failed`);
+
+ if (this._pendingCount)
+ this._print(`, ${this._pendingCount} pending`);
+ } else {
+ this._print('No specs found');
+ }
+
+ this._print('\n');
+ const seconds = Math.round(this.elapsedTime('main')) / 1000;
+ this._print(`\nFinished in ${seconds} s\n`);
+
+ this._failedSuites.forEach(this._printSuiteFailureDetails, this);
+
+ super.jasmineDone();
+ }
+
+ specDone(result) {
+ super.specDone(result);
+
+ const colors = {
+ passed: GREEN,
+ pending: YELLOW,
+ failed: RED,
+ disabled: undefined,
+ };
+ const symbols = {
+ passed: '.',
+ pending: '*',
+ failed: 'F',
+ disabled: '',
+ };
+ this._print(this._color(symbols[result.status], colors[result.status]));
+ }
+
+ _printSpecFailureDetails(result, index) {
+ this._print(`\n${index + 1}) ${result.fullName}\n`);
+ result.failedExpectations.forEach(failedExpectation => {
+ const report = `Message:
+${this._color(failedExpectation.message, RED)}
+Stack:
+${this.filterStack(failedExpectation.stack)}
+`;
+ this._print(indenter.indent(report, 2));
+ });
+ }
+
+ _printSuiteFailureDetails(result) {
+ result.failedExpectations.forEach(failedExpectation => {
+ this._print(this._color(`An error was thrown in an afterAll
+AfterAll ${failedExpectation.message}`, RED));
+ });
+ }
+});
--- /dev/null
--- /dev/null
++// This suite is Jasmine's documentation suite, exercising all of Jasmine's
++// functionality to make sure that the GJS test runner has hooked everything up
++// correctly. It's taken from the following pages:
++// https://github.com/jasmine/jasmine.github.io/blob/3.99-4.0/_tutorials/src/0_your_first_suite.js
++//
++// Note: the "long asynchronous specs" suite near the bottom takes 9 seconds to
++// run. It is marked pending by default. To run this suite anyway, define an
++// environment variable RUN_THOROUGH_TESTS=yes.
++
++import GLib from 'gi://GLib';
++
++/**
++ ## Suites: `describe` Your Tests
++ The [describe](/api/edge/global.html#describe) function is for grouping related specs, typically each test file has one at the top level.
++ The string parameter is for naming the collection of specs, and will be concatenated with specs to make a spec's full name.
++ This aids in finding specs in a large suite.
++ If you name them well, your specs read as full sentences in traditional [BDD](http://en.wikipedia.org/wiki/Behavior-driven_development) style.
++
++ ## Specs
++ Specs are defined by calling the global Jasmine function [it](/api/edge/global.html#it), which, like `describe` takes a string and a function.
++ The string is the title of the spec and the function is the spec, or test.
++ A spec contains one or more expectations that test the state of the code.
++ An expectation in Jasmine is an assertion that is either true or false.
++ A spec with all true expectations is a passing spec. A spec with one or more false expectations is a failing spec.
++ */
++describe("A suite", function() {
++ it("contains spec with an expectation", function() {
++ expect(true).toBe(true);
++ });
++});
++
++/**
++ ### It's Just Functions
++ Since `describe` and `it` blocks are functions, they can contain any executable code necessary to implement the test. JavaScript scoping rules apply, so variables declared in a `describe` are available to any `it` block inside the suite.
++ */
++describe("A suite is just a function", function() {
++ var a;
++
++ it("and so is a spec", function() {
++ a = true;
++
++ expect(a).toBe(true);
++ });
++});
++
++/**
++ ## Expectations
++ Expectations are built with the function `expect` which takes a value, called the actual.
++ It is chained with a Matcher function, which takes the expected value.
++ */
++describe("The 'toBe' matcher compares with ===", function() {
++ /**
++ ### Matchers
++ Each matcher implements a boolean comparison between the actual value and the expected value.
++ It is responsible for reporting to Jasmine if the expectation is true or false.
++ Jasmine will then pass or fail the spec.
++ */
++
++ it("and has a positive case", function() {
++ expect(true).toBe(true);
++ });
++
++ /**
++ Any matcher can evaluate to a negative assertion by chaining the call to `expect` with a `not` before calling the matcher.
++ */
++
++ it("and can have a negative case", function() {
++ expect(false).not.toBe(true);
++ });
++
++/**
++ Jasmine has a rich set of matchers included, you can find the full list in the [API docs](/api/edge/matchers.html)
++ There is also the ability to write [custom matchers](custom_matcher.html) for when a project's domain calls for specific assertions that are not included in Jasmine.
++ */
++});
++
++/**
++ ### Setup and Teardown
++ To help a test suite DRY up any duplicated setup and teardown code, Jasmine provides the global [beforeEach](/api/edge/global.html#beforeEach), [afterEach](/api/edge/global.html#afterEach), [beforeAll](/api/edge/global.html#beforeAll), and [afterAll](/api/edge/global.html#afterAll) functions.
++ */
++describe("A suite with some shared setup", function() {
++ var foo = 0;
++
++ // As the name implies, the `beforeEach` function is called once before each spec in the `describe` in which it is called
++ beforeEach(function() {
++ foo += 1;
++ });
++
++ // and the `afterEach` function is called once after each spec.
++ afterEach(function() {
++ foo = 0;
++ });
++
++ // The `beforeAll` function is called only once before all the specs in `describe` are run
++ beforeAll(function() {
++ foo = 1;
++ });
++
++ // and the `afterAll` function is called after all specs finish
++ afterAll(function() {
++ foo = 0;
++ });
++
++});
++
++/**
++ * `beforeAll` and `afterAll` can be used to speed up test suites with expensive setup and teardown.
++ *
++ * However, be careful using `beforeAll` and `afterAll`!
++ * Since they are not reset between specs, it is easy to accidentally leak state between your specs so that they erroneously pass or fail.
++ */
++
++
++/**
++### The `this` keyword
++Another way to share variables between a `beforeEach`, `it`, and `afterEach` is through the `this` keyword. Each spec's `beforeEach`/`it`/`afterEach` has the `this` as the same empty object that is set back to empty for the next spec's `beforeEach`/`it`/`afterEach`.
++*/
++describe("A spec", function() {
++ beforeEach(function() {
++ this.foo = 0;
++ });
++
++ it("can use the `this` to share state", function() {
++ expect(this.foo).toEqual(0);
++ this.bar = "test pollution?";
++ });
++
++ it("prevents test pollution by having an empty `this` created for the next spec", function() {
++ expect(this.foo).toEqual(0);
++ expect(this.bar).toBe(undefined);
++ });
++});
++
++
++/**
++ ### Manually failing a spec with `fail`
++ The `fail` function causes a spec to fail. It can take a failure message or an Error object as a parameter.
++ */
++
++describe("A spec using the fail function", function() {
++ var foo = function(x, callBack) {
++ if (x) {
++ callBack();
++ }
++ };
++
++ it("should not call the callBack", function() {
++ foo(false, function() {
++ fail("Callback has been called");
++ });
++ });
++});
++
++/**
++ ### Nesting `describe` Blocks
++ Calls to `describe` can be nested, with specs defined at any level. This allows a suite to be composed as a tree of functions. Before a spec is executed, Jasmine walks down the tree executing each `beforeEach` function in order. After the spec is executed, Jasmine walks through the `afterEach` functions similarly.
++ */
++describe("A spec", function() {
++ var foo;
++
++ beforeEach(function() {
++ foo = 0;
++ foo += 1;
++ });
++
++ afterEach(function() {
++ foo = 0;
++ });
++
++ it("is just a function, so it can contain any code", function() {
++ expect(foo).toEqual(1);
++ });
++
++ it("can have more than one expectation", function() {
++ expect(foo).toEqual(1);
++ expect(true).toEqual(true);
++ });
++
++ describe("nested inside a second describe", function() {
++ var bar;
++
++ beforeEach(function() {
++ bar = 1;
++ });
++
++ it("can reference both scopes as needed", function() {
++ expect(foo).toEqual(bar);
++ });
++ });
++});
++
++/**
++ ## Disabling Suites
++ Suites can be disabled with the `xdescribe` function. These suites and any specs inside them are skipped when run and thus their results will show as pending.
++ */
++xdescribe("A spec", function() {
++ var foo;
++
++ beforeEach(function() {
++ foo = 0;
++ foo += 1;
++ });
++
++ it("is just a function, so it can contain any code", function() {
++ expect(foo).toEqual(1);
++ });
++});
++
++/**
++ ## Pending Specs
++ Pending specs do not run, but their names will show up in the results as `pending`.
++ */
++
++describe("Pending specs", function() {
++
++ /** Any spec declared with `xit` is marked as pending.
++ */
++ xit("can be declared 'xit'", function() {
++ expect(true).toBe(false);
++ });
++
++ /** Any spec declared without a function body will also be marked pending in results.
++ */
++
++ it("can be declared with 'it' but without a function");
++
++ /** And if you call the function `pending` anywhere in the spec body, no matter the expectations, the spec will be marked pending.
++ * A string passed to `pending` will be treated as a reason and displayed when the suite finishes.
++ */
++ it("can be declared by calling 'pending' in the spec body", function() {
++ expect(true).toBe(false);
++ pending('this is why it is pending');
++ });
++});
++
++/**
++ ## Spies
++ Jasmine has test double functions called [spies](/api/edge/Spy.html).
++ A spy can stub any function and tracks calls to it and all arguments.
++ A spy only exists in the `describe` or `it` block in which it is defined, and will be removed after each spec.
++ There are special matchers for interacting with spies.
++ */
++
++describe("A spy", function() {
++ var foo, bar = null;
++
++ beforeEach(function() {
++ foo = {
++ setBar: function(value) {
++ bar = value;
++ }
++ };
++
++ // You can define what the spy will do when invoked with [and](/api/edge/Spy_and.html).
++ spyOn(foo, 'setBar');
++
++ foo.setBar(123);
++ foo.setBar(456, 'another param');
++ });
++
++ // The `toHaveBeenCalled` matcher will pass if the spy was called.
++ it("tracks that the spy was called", function() {
++ expect(foo.setBar).toHaveBeenCalled();
++ });
++
++ // The `toHaveBeenCalledTimes` matcher will pass if the spy was called the specified number of times.
++ it("tracks that the spy was called x times", function() {
++ expect(foo.setBar).toHaveBeenCalledTimes(2);
++ });
++
++ // The `toHaveBeenCalledWith` matcher will return true if the argument list matches any of the recorded calls to the spy.
++ it("tracks all the arguments of its calls", function() {
++ expect(foo.setBar).toHaveBeenCalledWith(123);
++ expect(foo.setBar).toHaveBeenCalledWith(456, 'another param');
++ });
++
++ it("stops all execution on a function", function() {
++ expect(bar).toBeNull();
++ });
++
++ // You get all of the data that a spy tracks about its calls with [calls](/api/edge/Spy_calls.html)
++ it("tracks if it was called at all", function() {
++ foo.setBar();
++
++ expect(foo.setBar.calls.any()).toEqual(true);
++ });
++});
++
++/**
++ ### Spies: `createSpy`
++ When there is not a function to spy on, [jasmine.createSpy](/api/edge/jasmine.html#.createSpy) can create a "bare" spy.
++ This spy acts as any other spy - tracking calls, arguments, etc. But there is no implementation behind it.
++ */
++describe("A spy, when created manually", function() {
++ var whatAmI;
++
++ beforeEach(function() {
++ whatAmI = jasmine.createSpy('whatAmI');
++
++ whatAmI("I", "am", "a", "spy");
++ });
++
++ it("tracks that the spy was called", function() {
++ expect(whatAmI).toHaveBeenCalled();
++ });
++});
++
++/**
++ ### Spies: `createSpyObj`
++ In order to create a mock with multiple spies, use [jasmine.createSpyObj](/api/edge/jasmine.html#.createSpyObj) and pass an array of strings.
++ It returns an object that has a property for each string that is a spy.
++ */
++describe("Multiple spies, when created manually", function() {
++ var tape;
++
++ beforeEach(function() {
++ tape = jasmine.createSpyObj('tape', ['play', 'pause', 'stop', 'rewind']);
++
++ tape.play();
++ tape.pause();
++ tape.rewind(0);
++ });
++
++ it("creates spies for each requested function", function() {
++ expect(tape.play).toBeDefined();
++ expect(tape.pause).toBeDefined();
++ expect(tape.stop).toBeDefined();
++ expect(tape.rewind).toBeDefined();
++ });
++});
++
++/**
++ * ## Matching with more finesse
++ *
++ * Sometimes you don't want to match with exact equality.
++ * Jasmine provides a number of asymmetric equality testers.
++ */
++describe("Matching with finesse", function() {
++
++ /**
++ * [jasmine.any](/api/edge/jasmine.html#.any) takes a constructor or "class" name as an expected value.
++ * It returns `true` if the constructor matches the constructor of the actual value.
++ */
++ describe("jasmine.any", function() {
++ it("matches any value", function() {
++ expect({}).toEqual(jasmine.any(Object));
++ expect(12).toEqual(jasmine.any(Number));
++ });
++
++ describe("when used with a spy", function() {
++ it("is useful for comparing arguments", function() {
++ var foo = jasmine.createSpy('foo');
++ foo(12, function() {
++ return true;
++ });
++
++ expect(foo).toHaveBeenCalledWith(jasmine.any(Number), jasmine.any(Function));
++ });
++ });
++ });
++
++ /**
++ [jasmine.anything](/api/edge/global.html#.anything) returns `true` if the actual value is not `null` or `undefined`.
++ */
++ describe("jasmine.anything", function() {
++ it("matches anything", function() {
++ expect(1).toEqual(jasmine.anything());
++ });
++
++ describe("when used with a spy", function() {
++ it("is useful when the argument can be ignored", function() {
++ var foo = jasmine.createSpy('foo');
++ foo(12, function() {
++ return false;
++ });
++
++ expect(foo).toHaveBeenCalledWith(12, jasmine.anything());
++ });
++ });
++ });
++
++ /**
++ [jasmine.objectContaining](/api/edge/global.html#.objectContaining) is for those times when an expectation only cares about certain key/value pairs in the actual.
++ */
++ describe("jasmine.objectContaining", function() {
++ var foo;
++
++ beforeEach(function() {
++ foo = {
++ a: 1,
++ b: 2,
++ bar: "baz"
++ };
++ });
++
++ it("matches objects with the expect key/value pairs", function() {
++ expect(foo).toEqual(jasmine.objectContaining({
++ bar: "baz"
++ }));
++ expect(foo).not.toEqual(jasmine.objectContaining({
++ c: 37
++ }));
++ });
++
++ describe("when used with a spy", function() {
++ it("is useful for comparing arguments", function() {
++ var callback = jasmine.createSpy('callback');
++
++ callback({
++ bar: "baz"
++ });
++
++ expect(callback).toHaveBeenCalledWith(jasmine.objectContaining({
++ bar: "baz"
++ }));
++ });
++ });
++ });
++
++ /**
++ [jasmine.arrayContaining](/api/edge/global.html#.arrayContaining) is for those times when an expectation only cares about some of the values in an array.
++ */
++ describe("jasmine.arrayContaining", function() {
++ var foo;
++
++ beforeEach(function() {
++ foo = [1, 2, 3, 4];
++ });
++
++ it("matches arrays with some of the values", function() {
++ expect(foo).toEqual(jasmine.arrayContaining([3, 1]));
++ expect(foo).not.toEqual(jasmine.arrayContaining([6]));
++ });
++
++ describe("when used with a spy", function() {
++ it("is useful when comparing arguments", function() {
++ var callback = jasmine.createSpy('callback');
++
++ callback([1, 2, 3, 4]);
++
++ expect(callback).toHaveBeenCalledWith(jasmine.arrayContaining([4, 2, 3]));
++ expect(callback).not.toHaveBeenCalledWith(jasmine.arrayContaining([5, 2]));
++ });
++ });
++ });
++
++ /**
++ [jasmine.stringMatching](/api/edge/global.html#.stringMatching) is for when you don't want to match a string in a larger object exactly, or match a portion of a string in a spy expectation.
++ */
++ describe('jasmine.stringMatching', function() {
++ it("matches as a regexp", function() {
++ expect({foo: 'bar'}).toEqual({foo: jasmine.stringMatching(/^bar$/)});
++ expect({foo: 'foobarbaz'}).toEqual({foo: jasmine.stringMatching('bar')});
++ });
++
++ describe("when used with a spy", function() {
++ it("is useful for comparing arguments", function() {
++ var callback = jasmine.createSpy('callback');
++
++ callback('foobarbaz');
++
++ expect(callback).toHaveBeenCalledWith(jasmine.stringMatching('bar'));
++ expect(callback).not.toHaveBeenCalledWith(jasmine.stringMatching(/^bar$/));
++ });
++ });
++ });
++
++ /**
++ ### Custom asymmetric equality tester
++ When you need to check that something meets a certain criteria, without being strictly equal, you can also specify a custom asymmetric equality tester simply by providing an object that has an `asymmetricMatch` function.
++ */
++ describe("custom asymmetry", function() {
++ var tester = {
++ asymmetricMatch: function(actual) {
++ var secondValue = actual.split(',')[1];
++ return secondValue === 'bar';
++ }
++ };
++
++ it("dives in deep", function() {
++ expect("foo,bar,baz,quux").toEqual(tester);
++ });
++
++ describe("when used with a spy", function() {
++ it("is useful for comparing arguments", function() {
++ var callback = jasmine.createSpy('callback');
++
++ callback('foo,bar,baz');
++
++ expect(callback).toHaveBeenCalledWith(tester);
++ });
++ });
++ });
++});
++
++
++/**
++ ## Jasmine Clock
++ The [Jasmine Clock](/api/edge/Clock.html) is available for testing time dependent code.
++ */
++describe("Manually ticking the Jasmine Clock", function() {
++ var timerCallback;
++
++ /**
++ It is installed with a call to `jasmine.clock().install` in a spec or suite that needs to manipulate time.
++ */
++ beforeEach(function() {
++ timerCallback = jasmine.createSpy("timerCallback");
++ jasmine.clock().install();
++ });
++
++ /**
++ Be sure to uninstall the clock after you are done to restore the original functions.
++ */
++ afterEach(function() {
++ jasmine.clock().uninstall();
++ });
++
++ /**
++ ### Mocking the JavaScript Timeout Functions
++ You can make `setTimeout` or `setInterval` synchronous executing the registered functions only once the clock is ticked forward in time.
++
++ To execute registered functions, move time forward via the `jasmine.clock().tick` function, which takes a number of milliseconds.
++ */
++ it("causes a timeout to be called synchronously", function() {
++ setTimeout(function() {
++ timerCallback();
++ }, 100);
++
++ expect(timerCallback).not.toHaveBeenCalled();
++
++ jasmine.clock().tick(101);
++
++ expect(timerCallback).toHaveBeenCalled();
++ });
++
++ it("causes an interval to be called synchronously", function() {
++ setInterval(function() {
++ timerCallback();
++ }, 100);
++
++ expect(timerCallback).not.toHaveBeenCalled();
++
++ jasmine.clock().tick(101);
++ expect(timerCallback.calls.count()).toEqual(1);
++
++ jasmine.clock().tick(50);
++ expect(timerCallback.calls.count()).toEqual(1);
++
++ jasmine.clock().tick(50);
++ expect(timerCallback.calls.count()).toEqual(2);
++ });
++
++ /**
++ ### Mocking the Date
++ The Jasmine Clock can also be used to mock the current date.
++ */
++ describe("Mocking the Date object", function(){
++ it("mocks the Date object and sets it to a given time", function() {
++ var baseTime = new Date(2013, 9, 23);
++ // If you do not provide a base time to `mockDate` it will use the current date.
++ jasmine.clock().mockDate(baseTime);
++
++ jasmine.clock().tick(50);
++ expect(new Date().getTime()).toEqual(baseTime.getTime() + 50);
++ });
++ });
++});
++
++
++/**
++ ## Asynchronous Support
++ Jasmine also has support for running specs that require testing asynchronous operations. The functions that you pass to `beforeAll`, `afterAll`, `beforeEach`, `afterEach`, and `it` can be asynchronous. There are three different ways to indicate that a function is asynchronous: by taking an optional callback parameter, by returning a promise, or by using the `async` keyword in environments that support it.
++ */
++describe("Asynchronous specs", function() {
++ var value;
++
++ /**
++ ### Using callbacks
++ */
++ describe("Using callbacks", function() {
++ /**
++ Calls to `beforeAll`, `afterAll`, `beforeEach`, `afterEach`, and `it` can take an optional single argument that should be called when the async work is complete.
++ */
++ beforeEach(function(done) {
++ setTimeout(function() {
++ value = 0;
++ done();
++ }, 1);
++ });
++
++ /**
++ This spec will not start until the `done` function is called in the call to `beforeEach` above. And this spec will not complete until its `done` is called.
++ */
++
++ it("should support async execution of test preparation and expectations", function(done) {
++ value++;
++ expect(value).toBeGreaterThan(0);
++ done();
++ });
++
++ /**
++ The `done.fail` function fails the spec and indicates that it has completed.
++ */
++ describe("A spec using done.fail", function() {
++ var foo = function(x, callBack1, callBack2) {
++ if (x) {
++ setTimeout(callBack1, 0);
++ } else {
++ setTimeout(callBack2, 0);
++ }
++ };
++
++ it("should not call the second callBack", function(done) {
++ foo(true,
++ done,
++ function() {
++ done.fail("Second callback has been called");
++ }
++ );
++ });
++ });
++ });
++
++ /**
++ ### Using promises
++ */
++ describe("Using promises", function() {
++ /**
++ Functions passed to `beforeAll`, `afterAll`, `beforeEach`, `afterEach`, and `it` can return a promise that should be resolved when the async work is complete. If the promise is rejected, all specs in the enclosing `describe` will fail.
++ */
++ beforeEach(function() {
++ return soon().then(function() {
++ value = 0;
++ });
++ });
++
++ /**
++ This spec will not start until the promise returned from the call to `beforeEach` above is settled. And this spec will not complete until the promise that it returns is settled. If the promise is rejected, the spec will fail.
++ */
++ it("should support async execution of test preparation and expectations", function() {
++ return soon().then(function() {
++ value++;
++ expect(value).toBeGreaterThan(0);
++ });
++ });
++ });
++
++ /**
++ ### Using async/await
++ */
++ describe("Using async/await", function() {
++ /**
++ Functions passed to `beforeAll`, `afterAll`, `beforeEach`, `afterEach`, and `it` can be declared `async` in environments that support `async`/`await`.
++ */
++ beforeEach(async function() {
++ await soon();
++ value = 0;
++ });
++
++ /**
++ This spec will not start until the promise returned from the call to `beforeEach` above is settled. And this spec will not complete until the promise that it returns is settled.
++ */
++ it("should support async execution of test preparation and expectations", async function() {
++ await soon();
++ value++;
++ expect(value).toBeGreaterThan(0);
++ });
++ });
++
++
++ /**
++ By default jasmine will wait for 5 seconds for an asynchronous spec to finish before causing a timeout failure.
++ If the timeout expires before `done` is called, the current spec will be marked as failed and suite execution will continue as if `done` was called.
++
++ If specific specs should fail faster or need more time this can be adjusted by passing a timeout value to `it`, etc.
++
++ If the entire suite should have a different timeout, `jasmine.DEFAULT_TIMEOUT_INTERVAL` can be set globally, outside of any given `describe`.
++ */
++ describe("long asynchronous specs", function() {
++ beforeEach(function(done) {
++ done();
++ }, 1000);
++
++ if (GLib.getenv('RUN_THOROUGH_TESTS') === 'yes') {
++ it("takes a long time", function(done) {
++ setTimeout(function() {
++ done();
++ }, 9000);
++ }, 10000);
++ }
++
++ afterEach(function(done) {
++ done();
++ }, 1000);
++ });
++
++ function soon() {
++ return new Promise(function(resolve, reject) {
++ setTimeout(function() {
++ resolve();
++ }, 1);
++ });
++ }
++});
--- /dev/null
+import Gio from 'gi://Gio';
+import GLib from 'gi://GLib';
+
+import * as Command from '../src/command.js';
+import * as JUnitReporter from '../src/junitReporter.js';
+import * as TapReporter from '../src/tapReporter.js';
+import * as VerboseReporter from '../src/verboseReporter.js';
+
+const {mainloop} = Command;
+
+describe('Jasmine command', function () {
+ let fakeJasmine;
+
+ beforeAll(function () {
+ Gio._promisify(Gio._LocalFilePrototype, 'delete_async', 'delete_finish');
+ });
+
+ beforeEach(function () {
+ fakeJasmine = jasmine.createSpyObj('jasmine', ['addReporter', 'configureDefaultReporter', 'execute']);
++ fakeJasmine.execute.and.resolveTo();
+ spyOn(mainloop, 'runAsync'); // stub out system behaviour
+ });
+
+ describe('running specs', function () {
+ it('shows colors by default', function () {
+ Command.run(fakeJasmine, []);
+ expect(fakeJasmine.addReporter)
+ .toHaveBeenCalledWith(jasmine.objectContaining({show_colors: true}));
+ });
+
+ it('allows colors to be turned off', function () {
+ Command.run(fakeJasmine, ['--no-color']);
+ expect(fakeJasmine.addReporter)
+ .toHaveBeenCalledWith(jasmine.objectContaining({show_colors: false}));
+ });
+
+ it('lets later color arguments override earlier ones', function () {
+ Command.run(fakeJasmine, ['--color', '--no-color']);
+ expect(fakeJasmine.addReporter)
+ .toHaveBeenCalledWith(jasmine.objectContaining({show_colors: false}));
+ Command.run(fakeJasmine, ['--no-color', '--color']);
+ expect(fakeJasmine.addReporter)
+ .toHaveBeenCalledWith(jasmine.objectContaining({show_colors: true}));
+ });
+
+ it('loads the verbose reporter', function () {
+ Command.run(fakeJasmine, ['--verbose']);
+ expect(fakeJasmine.addReporter).toHaveBeenCalled();
+ const [reporter] = fakeJasmine.addReporter.calls.argsFor(0);
+ expect(reporter.constructor).toBe(VerboseReporter.VerboseReporter);
+ });
+
+ it('loads the TAP reporter', function () {
+ Command.run(fakeJasmine, ['--tap']);
+ expect(fakeJasmine.addReporter).toHaveBeenCalled();
+ const [reporter] = fakeJasmine.addReporter.calls.argsFor(0);
+ expect(reporter.constructor).toBe(TapReporter.TapReporter);
+ });
+
+ it('loads the JUnit reporter alongside the usual reporter', function () {
+ // Unfortunately /dev/null can't be opened as a GFile, so we need to
+ // write to a temporary file.
+ const [tmpFile, stream] = Gio.File.new_tmp('junitreportXXXXXX');
+ const tmpPath = tmpFile.get_path();
+ stream.close(null);
+
+ Command.run(fakeJasmine, ['--junit', tmpPath]);
+ expect(fakeJasmine.addReporter.calls.count()).toBe(2);
+ const reporters = fakeJasmine.addReporter.calls.allArgs().map(args => args[0].constructor);
+ expect(reporters).toContain(JUnitReporter.JUnitReporter);
+
+ tmpFile.delete_async(GLib.PRIORITY_DEFAULT, null).then(() => {});
+ });
+
+ it('creates a directory for the report if necessary', function () {
+ const tmpDir = GLib.dir_make_tmp('junitreportXXXXXX');
+ const tmpFile =
+ Gio.File.new_for_path(tmpDir).get_child('dir').get_child('report.xml');
+ const tmpPath = tmpFile.get_path();
+
+ Command.run(fakeJasmine, ['--junit', tmpPath]);
+ expect(tmpFile.query_exists(null)).toBeTruthy();
+
+ tmpFile.delete_async(GLib.PRIORITY_DEFAULT, null)
+ .then(() => tmpFile.get_parent().delete_async(GLib.PRIORITY_DEFAULT, null))
+ .then(() => tmpFile.get_parent().get_parent().delete_async(GLib.PRIORITY_DEFAULT, null));
+ });
+
+ it('uses the value of JASMINE_JUNIT_REPORTS_DIR', function () {
+ const oldPath = GLib.getenv('JASMINE_JUNIT_REPORTS_DIR');
+ const tmpDir = GLib.dir_make_tmp('junitreportXXXXXX');
+ GLib.setenv('JASMINE_JUNIT_REPORTS_DIR', tmpDir, true);
+
+ Command.run(fakeJasmine, ['--junit', 'report.xml']);
+ const reportFile =
+ Gio.File.new_for_path(tmpDir).get_child('report.xml');
+ expect(reportFile.query_exists(null)).toBeTruthy();
+
+ reportFile.delete_async(GLib.PRIORITY_DEFAULT, null)
+ .then(() => reportFile.get_parent().delete_async(GLib.PRIORITY_DEFAULT, null));
+
+ if (oldPath !== null)
+ GLib.setenv('JASMINE_JUNIT_REPORTS_DIR', oldPath, true);
+ else
+ GLib.unsetenv('JASMINE_JUNIT_REPORTS_DIR');
+ });
+
+ it('executes the Jasmine suite', function (done) {
+ expectAsync(Command.run(fakeJasmine, [])).toBeResolvedTo(0);
+ // fakeJasmine.execute() is started in idle
+ GLib.idle_add(GLib.PRIORITY_DEFAULT, function () {
+ expect(fakeJasmine.execute).toHaveBeenCalled();
+ done();
+ });
+ });
+
+ it('runs the specified specs', function (done) {
+ Command.run(fakeJasmine, ['spec/some/fileSpec.js', '--no-color']);
+ GLib.idle_add(GLib.PRIORITY_DEFAULT, function () {
+ expect(fakeJasmine.execute).toHaveBeenCalledWith(['spec/some/fileSpec.js']);
+ done();
+ });
+ });
+ });
+});
--- /dev/null
--- /dev/null
++/**
++ *
++ * Often a project will want to encapsulate custom matching code for use across multiple specs. Here is how to create a Jasmine-compatible custom matcher.
++ *
++ * A custom matcher at its root is a comparison function that takes an `actual` value and `expected` value. This factory is passed to Jasmine, ideally in a call to `beforeEach` and will be in scope and available for all of the specs inside a given call to `describe`. Custom matchers are torn down between specs. The name of the factory will be the name of the matcher exposed on the return value of the call to `expect`.
++ *
++ */
++
++/**
++ * This object has a custom matcher named "toBeGoofy".
++ */
++var customMatchers = {
++
++ /**
++ * ## Matcher Factories
++ *
++ * Custom matcher factories are passed a `matchersUtil` parameter, which has a set
++ * of utility functions for matchers to use to perform tasks like determining
++ * whether two objects are equal
++ * (see: [`MatchersUtil`][MatchersUtil] for reference documentation). By using
++ * `MatchersUtil` where appropriate, custom matchers can work with
++ * [custom equality testers][CustomEqualityTesters] and
++ * [custom object formatters][CustomObjectFormatters] without any extra effort.
++ *
++ * A second `customEqualityTesters` parameter is passed for compatibility with
++ * Jasmine 3.5 and earlier. Matchers written for Jasmine 3.6 and later should
++ * ignore it. It will no longer be provided in Jasmine 4.
++ *
++ * [MatchersUtil]: /api/edge/MatchersUtil.html
++ * [CustomEqualityTesters]: /tutorials/custom_equality
++ * [CustomObjectFormatters]: /tutorials/custom_object_formatters
++ */
++ toBeGoofy: function(matchersUtil) {
++ /**
++ * The factory method should return an object with a `compare` function that will be called to check the expectation.
++ */
++ return {
++ /**
++ * ## A Function to `compare`
++ *
++ * The compare function receives the value passed to `expect()` as the first argument - the actual - and the value (if any) passed to the matcher itself as second argument.
++ */
++ compare: function(actual, expected) {
++
++ /**
++ * `toBeGoofy` takes an optional `expected` argument, so define it here if not passed in.
++ */
++ if (expected === undefined) {
++ expected = '';
++ }
++
++ /**
++ * ### Result
++ *
++ * The `compare` function must return a result object with a `pass` property that is a boolean result of the matcher. The `pass` property tells the expectation whether the matcher was successful (`true`) or unsuccessful (`false`). If the expectation is called/chained with `.not`, the expectation will negate this to determine whether the expectation is met.
++ */
++ var result = {};
++
++ /**
++ * `toBeGoofy` tests for equality of the actual's `hyuk` property to see if it matches the expectation.
++ */
++ result.pass = matchersUtil.equals(actual.hyuk, "gawrsh" + expected);
++
++ /**
++ * ### Failure Messages
++ *
++ * If left `undefined`, the expectation will attempt to craft a failure message for the matcher. However, if the return value has a `message` property it will be used for a failed expectation.
++ */
++ if (result.pass) {
++ /**
++ * The matcher succeeded, so the custom failure message should be present in the case of a negative expectation - when the expectation is used with `.not`.
++ */
++ result.message = "Expected " + actual + " not to be quite so goofy";
++ } else {
++ /**
++ * The matcher failed, so the custom failure message should be present in the case of a positive expectation
++ */
++ result.message = "Expected " + actual + " to be goofy, but it was not very goofy";
++ }
++
++ /**
++ * Return the result of the comparison.
++ */
++ return result;
++ }
++ };
++ }
++};
++
++/**
++* ### Custom negative comparators
++*
++* If you need more control over the negative comparison (the `not` case) than the simple boolean inversion above, you can also have your matcher factory include another key, `negativeCompare` alongside `compare`, for which the value is a function to invoke when `.not` is used. This function/key is optional.
++*/
++
++/**
++ * ## Registration and Usage
++ */
++describe("Custom matcher: 'toBeGoofy'", function() {
++ /**
++ * Register the custom matchers with Jasmine. All properties on the object passed in will be available as custom matchers (e.g., in this case `toBeGoofy`).
++ */
++ beforeEach(function() {
++ jasmine.addMatchers(customMatchers);
++ });
++
++ /**
++ * Once a custom matcher is registered with Jasmine, it is available on any expectation.
++ */
++ it("is available on an expectation", function() {
++ expect({
++ hyuk: 'gawrsh'
++ }).toBeGoofy();
++ });
++
++ it("can take an 'expected' parameter", function() {
++ expect({
++ hyuk: 'gawrsh is fun'
++ }).toBeGoofy(' is fun');
++ });
++
++ it("can be negated", function() {
++ expect({
++ hyuk: 'this is fun'
++ }).not.toBeGoofy();
++ });
++});
--- /dev/null
- expect(() => testJasmine.loadSpecs()).not.toThrow();
+import Gio from 'gi://Gio';
+import GLib from 'gi://GLib';
+
+import * as JasmineBoot from '../src/jasmineBoot.js';
+
+const [testFile] = GLib.filename_from_uri(import.meta.url);
+const testDir = GLib.path_get_dirname(testFile);
+
+const customMatchers = {
+ toMatchAllFiles() {
+ return {
+ compare(actual, expected) {
+ const result = {
+ message: `Expected ${JSON.stringify(actual)} `,
+ };
+ if (actual.length !== expected.length) {
+ result.pass = false;
+ result.message += `to match ${expected.length} ${
+ expected.length === 1 ? 'file' : 'files'
+ }, but it contained ${actual.length}`;
+ return result;
+ }
+
+ let unexpectedFile;
+ result.pass = actual.every(path => {
+ const actualFile = Gio.File.new_for_path(path);
+ const retval = expected.some(expectedPath => {
+ const expectedFile = Gio.File.new_for_path(expectedPath);
+ return actualFile.equal(expectedFile);
+ });
+ if (!retval)
+ unexpectedFile = path;
+ return retval;
+ });
+ if (result.pass) {
+ result.message += `not to match a list of files ${
+ expected}, but it did.`;
+ } else if (unexpectedFile) {
+ result.message += `to match a list of files ${expected
+ }, but it contained ${unexpectedFile}`;
+ } else {
+ result.message += `to match the list of files ${expected
+ }, but it did not: ${actual}`;
+ }
+ return result;
+ },
+ };
+ },
+};
+
+describe('Jasmine boot', function () {
+ let testJasmine;
+
+ beforeEach(function () {
+ const bootedJasmine = {
+ getEnv: jasmine.createSpy('getEnv').and.returnValue({
+ addReporter: jasmine.createSpy('addReporter'),
+ execute: jasmine.createSpy('execute'),
+ configure: jasmine.createSpy('configure'),
+ }),
+ Timer: jasmine.createSpy('Timer'),
+ Expectation: {
+ addMatchers: jasmine.createSpy('addMatchers'),
+ },
+ };
+
+ const fakeJasmineRequireObj = {
+ core: jasmine.createSpy('core').and.returnValue(bootedJasmine),
+ interface: jasmine.createSpy('interface'),
+ };
+
+ const fakeJasmineCore = {
+ getJasmineRequireObj() {
+ return fakeJasmineRequireObj;
+ },
+ __file__: 'fake/jasmine/path/jasmine.js',
+ };
+
+ testJasmine = new JasmineBoot.Jasmine({jasmineCore: fakeJasmineCore});
+
+ jasmine.addMatchers(customMatchers);
+ });
+
+ it('adds a nonexistent spec file', function () {
+ expect(testJasmine.specFiles).toEqual([]);
+ testJasmine.addSpecFiles([`${testDir}/non/existent/file.js`]);
+ expect(testJasmine.specFiles).toMatchAllFiles([
+ `${testDir}/non/existent/file.js`,
+ ]);
+ });
+
+ it('adds a real spec file', function () {
+ expect(testJasmine.specFiles).toEqual([]);
+ testJasmine.addSpecFiles([`${testDir}/fixtures/someSpec.js`]);
+ expect(testJasmine.specFiles).toMatchAllFiles([
+ `${testDir}/fixtures/someSpec.js`,
+ ]);
+ });
+
+ it('adds more than one spec file', function () {
+ expect(testJasmine.specFiles).toEqual([]);
+ testJasmine.addSpecFiles([
+ `${testDir}/fixtures/someSpec.js`,
+ `${testDir}/fixtures/otherSpec.js`,
+ ]);
+ expect(testJasmine.specFiles).toMatchAllFiles([
+ `${testDir}/fixtures/someSpec.js`,
+ `${testDir}/fixtures/otherSpec.js`,
+ ]);
+ });
+
+ it('adds a whole directory of spec files', function () {
+ expect(testJasmine.specFiles).toEqual([]);
+ testJasmine.addSpecFiles([`${testDir}/fixtures`]);
+ expect(testJasmine.specFiles).toMatchAllFiles([
+ `${testDir}/fixtures/include/module.js`,
+ `${testDir}/fixtures/include/spec.js`,
+ `${testDir}/fixtures/otherSpec.js`,
+ `${testDir}/fixtures/path1/test.js`,
+ `${testDir}/fixtures/path2/test.js`,
+ `${testDir}/fixtures/someSpec.js`,
+ `${testDir}/fixtures/syntaxErrorSpec.js`,
+ ]);
+ expect(testJasmine.specFiles.every(path => path.indexOf('notASpec.txt') === -1)).toBe(true);
+ });
+
+ it('adds spec files in different directories with the same name', function () {
+ testJasmine.addSpecFiles([
+ `${testDir}/fixtures/path1`,
+ `${testDir}/fixtures/path2`,
+ ]);
+ expect(testJasmine.specFiles).toMatchAllFiles([
+ `${testDir}/fixtures/path1/test.js`,
+ `${testDir}/fixtures/path2/test.js`,
+ ]);
+ });
+
+ it('respects excluded files', function () {
+ testJasmine.exclusions = ['otherSpec.js', 'syntaxErrorSpec.js'];
+ testJasmine.addSpecFiles([`${testDir}/fixtures`]);
+ expect(testJasmine.specFiles).toMatchAllFiles([
+ `${testDir}/fixtures/include/module.js`,
+ `${testDir}/fixtures/include/spec.js`,
+ `${testDir}/fixtures/someSpec.js`,
+ `${testDir}/fixtures/path1/test.js`,
+ `${testDir}/fixtures/path2/test.js`,
+ ]);
+ });
+
+ it('matches at the end of the containing path', function () {
+ testJasmine.exclusions = ['test/fixtures'];
+ testJasmine.addSpecFiles([`${testDir}/fixtures`]);
+ expect(testJasmine.specFiles).toMatchAllFiles([
+ `${testDir}/fixtures/include/module.js`,
+ `${testDir}/fixtures/include/spec.js`,
+ `${testDir}/fixtures/path1/test.js`,
+ `${testDir}/fixtures/path2/test.js`,
+ ]);
+ });
+
+ it('can handle globs in excluded files', function () {
+ testJasmine.exclusions = ['*.js'];
+ testJasmine.addSpecFiles([`${testDir}/fixtures`]);
+ expect(testJasmine.specFiles).toMatchAllFiles([]);
+ });
+
+ it('adds the Jasmine path when adding a reporter', function () {
+ const fakeReporter = {};
+ testJasmine.addReporter(fakeReporter);
+ expect(fakeReporter.jasmine_core_path).toMatch('fake/jasmine/path');
+ });
+
+ it('imports spec files in different directories with the same name', function () {
+ testJasmine.addSpecFiles([
+ `${testDir}/fixtures/path1`,
+ `${testDir}/fixtures/path2`,
+ ]);
+ expectAsync(testJasmine.loadSpecs()).toBeRejectedWithError(Error,
+ 'Catch this error to ensure this file is loaded');
+ });
+
+ it('does not bail out altogether if one of the specs has a syntax error', function () {
+ testJasmine.addSpecFiles([`${testDir}/fixtures/syntaxErrorSpec.js`]);
- expect(() => testJasmine.loadSpecs()).not.toThrow();
++ expectAsync(testJasmine.loadSpecs()).toBeResolved();
+ });
+
+ it('does not bail out altogether if one of the specs does not exist', function () {
+ testJasmine.addSpecFiles(['non/existent/file.js']);
++ expectAsync(testJasmine.loadSpecs()).toBeResolved();
+ });
+});